我正在使用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)
 


#1 楼

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

首先,您需要导入os模块

import os

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

评论


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

– Rico
2014年5月25日20:26

os.system()已被弃用,以支持子进程,请参见stackoverflow.com/a/4256153/4212158

–神秘
18年6月28日在17:30

#2 楼

通常,使用子流程模块

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


进行命令行调用。

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

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


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

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

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

评论


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

– uhoh
18年3月14日在8:44

#3 楼

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

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

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

# Run it only if called from the command line
if __name__ == '__main__':
    run()


# Scale1.py
import Scale2

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


评论


+1,由于python具有此功能,因此这将是最干净的答案。

–LuWi
2014年5月21日在19:35

+1,这是执行OP所需的正确方法,应该是公认的答案。

–user8894
2014年5月27日在16:10