我有一个每天早晨运行的例程,希望在该例程中运行一系列程序。看起来像这样。 (programCaller.py的内容)
programs = [
'program 1',
'program 2',
'program 3'
]
for program in programs:
print('Executing: ' + program)
p = subprocess.Popen('/path/to/directory/' + program)
p.communicate()
一切都运转良好,直到一周左右。它是实时通信的(在Mac上运行时,我在Windows上一直努力获得的特权),如果程序失败,它将转到下一个程序。
现在,它不仅可以从IDLE运行。但是,它在终端“ ./programCaller.py”中可以正常工作。
所有程序都有shebang行和权限。我已经尝试了shell = True,可执行文件,stdout和其他参数的所有变体,但无法正常工作。
它的作用是立即完成执行,并给我一个“ >>>”提示,就好像完成了一样。而且它不能在后台运行,因为我已经测试了一个非常简单的程序,该程序可以向我发送邮件,但是它没有执行此操作。
某些事情必须更改,也许它使用另一个可执行文件,但这是无声的崩溃。
答案 0 :(得分:0)
如果是启动调用,则应确保使用所需的Python正确调用了programCaller.py
,因此"/path/to/Python/python" programCaller.py
我不知道这在Mac上是如何工作的,但是在Windows上,我建议您使用{ {3}}基于programCaller.py
创建一个exe。
此外,如果要进行调试,请在time.sleep()
之后添加print(p)
或p.communicate()
,只是为了确保正确创建了子流程。我建议这样做是因为如果您使用的是其他版本的Python,则可能会缺少一些外部库。
更复杂的是:
try:
p = subprocess.Popen('/path/to/directory/' + program)
stdout, stderr = p.communicate()
print(stdout)
print(stderr)
except KeyboardInterrupt:
p.kill()
print("KeyboardInterrupt: killing process")
except Exception as e:
print(e)
如果子流程不需要输入:
try:
p = subprocess.Popen('/path/to/directory/' + program)
output = p.stdout.readline()
if output:
sys.stdout.flush()
print(output)
except KeyboardInterrupt:
p.kill()
print("KeyboardInterrupt: killing process")
except Exception as e:
print(e)