如何在Python脚本中运行命令行命令?


16

我正在使用2个单独的脚本Scale1.pyScale2.py。要运行它们,我输入sudo python Scale1.pysudo python Scale2.py从终端命令行输入。我希望Scale2.py脚本中有一行,如果我按一个按钮,程序就会中断并运行Scale1.py。像这样的东西,是行不通的。

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

Answers:


24

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

首先,您将需要导入os模块

import os

我没有带atm的pi来测试,但这来自该问题的第二个答案:https : //stackoverflow.com/questions/89228/calling-an-external-command-in-python


这就是我尝试过的方法,它很有效,非常感谢Harry!但是我确实必须先结合这两个程序。现在os.system(“ sudo python Scale3.py”)只需在Scale3.py程序的开头重新启动,就可以了。我认为导入Scale3.py也将起作用。我没有尝试子流程,它看起来确实很有趣,可能是我需要学习的东西。
Rico

os.system()已偏爱于subprocess,请参见stackoverflow.com/a/4256153/4212158
crypdick

12

通常,使用子流程模块

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

用于命令行调用。

一个处理子流程调用结果的示例;

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

子进程替换了几个较旧的模块和功能,例如os.systemos.spawn。它在清理参数方面做得很好,因此可以保护您免受shell注入的侵害

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

当然,运行第二个python脚本不需要CLI调用,您可以导入这些脚本。


我正在尝试学习如何从Python脚本中发出命令(请参阅此处此处),并且遇到一些问题。我想知道是否subprocess对我来说也更好。
uhoh

6

您可以按照harry sib的建议使用sudo,但是必须将运行第一个脚本的用户添加到sudoers文件中

从另一个python脚本运行python脚本的最佳方法是导入它。您应该在第二个脚本的方法中具有脚本的逻辑:

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

#仅在从命令行调用时运行
如果__name__ =='__main__':
    跑()
#Scale1.py
导入Scale2

如果(GPIO.input(23)== False):
    Scale2.run()

2
+1,由于python具有此功能,因此将是cleanest答案。
LuWi 2014年

1
+1,这是执行OP所需的正确方法,应该是公认的答案。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.