Bagaimana cara menjalankan perintah baris perintah dalam skrip Python?

16

Saya menggunakan 2 skrip terpisah, Scale1.pydan Scale2.py. Untuk menjalankannya saya masukkan sudo python Scale1.pyatau sudo python Scale2.pydari baris perintah terminal. Saya ingin memiliki baris dalam Scale2.pyskrip di mana jika saya menekan tombol, program akan rusak dan berjalan Scale1.py. Sesuatu seperti ini, yang tidak berhasil.

if GPIO.input(23) == False:
    break(sudo python Scale1.py)
Rico
sumber

Jawaban:

24

os.system("sudo python scale1.py")

pertama Anda harus mengimpor modul os

import os

Saya tidak memiliki pi dengan saya untuk diuji, tetapi ini berasal dari jawaban kedua untuk pertanyaan ini: /programming/89228/calling-an-external-command-in-python

mrwhale
sumber
Ini yang saya coba dan berhasil, terima kasih banyak Harry! Tapi saya memang harus menggabungkan kedua program terlebih dahulu. Sekarang sistem os.s ("sudo python Scale3.py") cukup restart pada awal program Scale3.py, yang baik-baik saja. Saya pikir impor Scale3.py juga akan berfungsi. Saya tidak mencoba subproses, memang terlihat menarik dan mungkin sesuatu yang perlu saya pelajari.
Rico
os.system()telah dikurangi demi subprocess, lihat stackoverflow.com/a/4256153/4212158
crypdick
11

Secara umum, gunakan modul subproses

subprocess.call(["sudo","python","scale1.py"]) 

untuk panggilan baris perintah.

Contoh memproses hasil panggilan subproses;

 result = subprocess.check_output(['sudo','service','mpd','restart'])

Subprocess menggantikan beberapa modul dan fungsi yang lebih lama, seperti os.system dan os.spawn . Itu melakukan pekerjaan yang baik dalam membersihkan argumen, sehingga melindungi Anda dari injeksi shell .

https://docs.python.org/2/library/subprocess.html

Tentu saja untuk menjalankan skrip python kedua tidak perlu untuk panggilan CLI, Anda dapat mengimpornya.

Janghou
sumber
Saya mencoba mempelajari cara mengeluarkan perintah dari dalam skrip Python (lihat di sini dan di sini ) dan mengalami beberapa masalah. Saya bertanya-tanya apakah subprocessmungkin lebih baik dalam kasus saya juga.
uhoh
6

Anda dapat menggunakan sudo seperti yang disarankan harry sib, tetapi Anda harus menambahkan pengguna yang menjalankan skrip pertama ke file sudoers .

Cara terbaik untuk menjalankan skrip python dari skrip python lain adalah dengan mengimpornya. Anda harus memiliki logika skrip Anda dalam metode di skrip kedua:

# Scale2.py
def run ():
    do_first ()
    do_second ()
    [...]

# Jalankan hanya jika dipanggil dari baris perintah
if __name__ == '__main__':
    Lari()
# Scale1.py
Skala impor2

if (GPIO.input (23) == Salah):
    Scale2.run ()
Gagaro
sumber
2
+1, Karena python mampu melakukan ini, itu akan menjadi cleanestjawabannya.
LuWi
1
+1, ini adalah cara yang benar untuk melakukan apa yang diinginkan OP dan mungkin seharusnya menjadi jawaban yang diterima.