Scale1.py
和Scale2.py
。要运行它们,我从终端命令行输入sudo python Scale1.py
或sudo 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
#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
评论
这是我尝试过的并且有效的方法,非常感谢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