Python komut dosyasında bir komut satırı komutunu nasıl çalıştırabilirim?


16

2 ayrı komut dosyası kullanıyorum Scale1.pyve Scale2.py. Bunları çalıştırmak için sudo python Scale1.pyveya sudo python Scale2.pyterminal komut satırından giriyorum . Scale2.pyEğer bir düğmeye basarsam, programın kırıldığı ve çalıştığı kodda bir satır olmasını istiyorum Scale1.py. Böyle bir şey, işe yaramaz.

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

Yanıtlar:


24

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

önce os modülünü içe aktarmanız gerekecek

import os

Test etmek için yanımda bir pi yok, ama bu bu sorunun ikinci cevabından geliyor: /programming/89228/calling-an-external-command-in-python


Ben de denedim ve işe yaradı, çok teşekkürler Harry! Ama önce her iki programı da birleştirmem gerekiyordu. Şimdi os.system ("sudo python Scale3.py") basitçe Scale3.py programının başlangıcında yeniden başlar. Sanırım import Scale3.py de işe yarayacak. Alt süreci denemedim, ilginç görünüyor ve muhtemelen öğrenmem gereken bir şey.
Rico

os.system()lehine subprocess
sınırlandırılmış

12

Genel olarak, alt işlem modülünü kullanın

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

komut satırı çağrıları için.

Alt işlem çağrısının sonucunu işleyen bir örnek;

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

Alt işlem , os.system ve os.spawn gibi bazı eski modüllerin ve işlevlerin yerini alır . Argümanları sterilize etmede iyi bir iş çıkarır, bu yüzden sizi kabuk enjeksiyonundan korur .

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

Tabii ki ikinci bir python betiği çalıştırmak için CLI çağrısına gerek yoktur, bunları içe aktarabilirsiniz.


Ben nasıl bir Python komut dosyası ( burada ve burada ) içinden komutları vermek ve bazı sorunları olan öğrenmeye çalışıyorum . subprocessBenim durumumda da daha iyi olup olmadığını merak ediyorum .
uhoh

6

Harry sib'in önerdiği gibi sudo'yu kullanabilirsiniz, ancak sudoers dosyasına ilk betiği çalıştıran kullanıcıyı eklemeniz gerekir .

Başka bir python betiğinden bir python betiği çalıştırmanın en iyi yolu onu içe aktarmaktır. İkinci komut dosyasındaki bir yöntemde komut dosyanızın mantığına sahip olmalısınız:

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

# Sadece komut satırından çağrıldığında çalıştır
__name__ == '__main__' ise:
    Çalıştırmak()
# Scale1.py
Ölçek2'yi içe aktar

eğer (GPIO.input (23) == Yanlış):
    Scale2.run ()

2
+1, python bunu yapabildiğinden, cleanestcevap olacaktır .
LuWi

1
+1, OP'nin istediğini yapmanın doğru yolu budur ve muhtemelen kabul edilen cevap olmalıdır.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.