【发布时间】:2018-07-01 22:00:01
【问题描述】:
要从终端启动 python 脚本(运行 OLED 显示器需要它),我必须使用以下 bash 命令:python demo_oled_v01.py --display ssd1351 --width 128 --height 128 --interface spi --gpio-data-command 20。 .py 之后的那些参数很重要,否则,脚本将以默认设置运行,在我的情况下,脚本将不会以默认设置启动。因此,需要这些参数。
当我需要从另一个 python 脚本启动我的脚本(而不是在终端上使用 bash 命令)时,就会出现问题。从父脚本启动我的 python 脚本之一。我用过:
import subprocess # to use subprocess
p = subprocess.Popen(['python', 'demo_oled_v01.py --display ssd1351 --width 128 --height 128 --interface spi --gpio-data-command 20'])
在我的父脚本中,但我收到一条错误消息:
python: can't open file 'demo_oled_v01.py --display ssd1351 --width 128 --height 128 --interface spi --gpio-data-command 20': [Errno 2] No such file or directory
我怀疑在.py 之后添加参数--display ssd1351 --width 128 --height 128 --interface spi --gpio-data-command 20 可能会导致脚本启动困难。如前所述,这些参数对于我在终端上使用 bash 命令启动是必不可少的。如何使用带有所需参数的子进程来启动此脚本?
【问题讨论】:
-
从 Python 运行 Python 是一种奇怪的反模式。看看
demo_oled_v01.py是否可以重构为可以加载到主 Python 脚本中的模块(或者可能已经有这个功能)。 -
@tripleeee:感谢您的建议。我使用 subprocess 而不是 import 的原因是我从经验中发现,通过 subprocess 方法从父脚本关闭辅助脚本更可靠。但是,我对所有这些都很陌生,所以我可能是错的。如果在这种情况下子流程不理想,您认为我应该如何实施?
-
一个常见的设计是有一个简单的
def main()并调用它if __name__ == '__main__'但如果你import库,__name__是别的东西然后你可以使用你@的方法987654332@ 以您从调用脚本中认为合适的方式。main()的设计应该是它只调用其他方法并处理直接从命令行调用的简单情况,并且它调用的内部函数应该足够模块化,您可以以不同的顺序或以其他方式调用它们来自执行import的脚本的参数。 -
这可能过于简洁,无法真正提供帮助,但谷歌
python __name__ __main__无法在实践中看到这一点。 -
@tripleee:如果我使用
import来启动这个脚本。我如何也包含这些参数?即--display ssd1351 --width 128 --height 128 --interface spi --gpio-data-command 20我对启动典型python脚本(例如script1.py)的理解是使用:import script1而不包括.py。
标签: python bash subprocess