ฉันจะรันคำสั่งบรรทัดคำสั่งในสคริปต์ Python ได้อย่างไร


16

ผมใช้ 2 สคริปต์ที่แยกจากกันและScale1.py Scale2.pyเพื่อรันพวกเขาฉันป้อนsudo python Scale1.pyหรือsudo python Scale2.pyจากบรรทัดคำสั่ง terminal ผมอยากจะมีสายในส่วนสคริปต์ซึ่งถ้าผมกดปุ่มแบ่งโปรแกรมและวิ่งScale2.py Scale1.pyบางอย่างเช่นนี้ซึ่งไม่ทำงาน

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

คำตอบ:


24

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

ก่อนอื่นคุณจะต้องนำเข้าโมดูลระบบปฏิบัติการ

import os

ฉันไม่มี pi กับฉันเพื่อทดสอบ แต่นี่มาจากคำตอบที่สองสำหรับคำถามนี้: /programming/89228/calling-an-external-command-in-python


นี่คือสิ่งที่ฉันพยายามและใช้งานได้ดีขอบคุณแฮร์รี่! แต่ฉันต้องรวมโปรแกรมทั้งสองก่อน ตอนนี้ระบบปฏิบัติการ os.system ("sudo python Scale3.py") เพียงรีสตาร์ทที่จุดเริ่มต้นของโปรแกรม Scale3.py ซึ่งไม่เป็นไร ฉันคิดว่าการนำเข้า Scale3.py จะใช้งานได้เช่นกัน ฉันไม่ได้ลอง subprocess มันดูน่าสนใจและอาจเป็นสิ่งที่ฉันต้องเรียนรู้
Rico

os.system()ได้รับการสนับสนุนจากsubprocessโปรดดูstackoverflow.com/a/4256153/4212158
crypdick

12

โดยทั่วไปให้ใช้โมดูลกระบวนการย่อย

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

สำหรับการเรียกบรรทัดคำสั่ง

ตัวอย่างการประมวลผลผลลัพธ์ของการเรียก subprocess

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

กระบวนการย่อยแทนที่โมดูลผู้ใหญ่หลายและหน้าที่เช่นos.systemและos.spawn มันไม่ได้งานที่ดีในการฆ่าเชื้อข้อโต้แย้งจึงปกป้องคุณจากการฉีดเปลือก

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

แน่นอนว่าการเรียกใช้สคริปต์ python ที่สองนั้นไม่จำเป็นสำหรับการเรียก CLI คุณสามารถนำเข้าสิ่งเหล่านั้นได้


ฉันพยายามเรียนรู้วิธีการออกคำสั่งจากภายในสคริปต์ Python (ดูที่นี่และที่นี่ ) และมีปัญหาบางอย่าง ฉันสงสัยว่าsubprocessอาจจะดีกว่าในกรณีของฉันเช่นกัน
uhoh

6

คุณสามารถใช้ sudo แฮร์รี่ SIB ปัญหา แต่คุณจะต้องมีการเพิ่มผู้ใช้เรียกใช้สคริปต์แรกที่sudoers ไฟล์

วิธีที่ดีที่สุดในการเรียกใช้สคริปต์ python จากสคริปต์ python อื่นคือการนำเข้า คุณควรมีตรรกะของสคริปต์ของคุณในวิธีการในสคริปต์ที่สอง:

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

# รันเฉพาะเมื่อเรียกจากบรรทัดคำสั่ง
ถ้า __name__ == '__main__':
    วิ่ง()
# Scale1.py
นำเข้า Scale2

if (GPIO.input (23) == False):
    Scale2.run ()

2
+1, เนื่องจาก python มีความสามารถในสิ่งนี้มันจะเป็นcleanestคำตอบ
LuWi

1
+1 นี่คือวิธีที่ถูกต้องในการทำสิ่งที่ OP ต้องการและน่าจะเป็นคำตอบที่ยอมรับได้
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.