【问题标题】:subprocess.Popen and communicate() don't execute the program, while Terminal doessubprocess.Popen 和communicate() 不执行程序,而终端执行
【发布时间】:2019-08-06 09:25:40
【问题描述】:

我有一个每天早上运行的例程,我希望在其中运行一系列程序。它看起来像这样。 (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()

直到一周左右之前,一切都运行良好。它实时通信(我在 Windows 上努力获得的特权,因为我在 Mac 上运行它),如果一个程序失败,它会转到下一个。

现在它不仅仅从 IDLE 运行。但是,它在终端“./programCaller.py”上工作得很好。

当然,所有程序都有shebang行和权限。我已经尝试了 shell=True、executable、stdout 和其他参数的所有变体,但它不起作用。

它的作用是立即完成执行,给我“>>>”提示,就好像它已经完成一样。而且它在后台不起作用,因为我测试了一个非常简单的程序,它可以向我发送邮件,但它没有这样做。

某些东西肯定发生了变化,也许它使用了另一个可执行文件,但它是无声的崩溃。

【问题讨论】:

  • 您可能需要用双引号将程序路径括起来",因为它可能包含嵌入的空格字符。
  • 这有什么不同吗?无论如何,我的标题中从来没有空格
  • 但是你的programs 中确实有空格——当传递给Popen 的第一个参数是单个字符串时,是的it does matter

标签: python terminal subprocess popen execution


【解决方案1】:

如果是启动调用,您应该确保使用您想要的 python 正确调用 programCaller.py,所以 "/path/to/Python/python" programCaller.py 我不知道这在 Mac 上是如何工作的,但在 Windows 上我建议您使用 https://pypi.org/project/auto-py-to-exe/ 创建一个基于programCaller.py的exe。

此外,如果您想进行调试,请在p.communicate() 之后添加time.sleep()print(p),以确保正确创建子进程。我建议这样做是因为如果您使用不同版本的 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)

【讨论】:

  • 我尝试了 IDLE 和终端。第一个 IDLE:无 无,第一个来自终端:无 无但随后实际执行了代码(给我发一封电子邮件),第二个在 IDLE:'NoneType' 对象没有属性'readline',第二个来自终端:相同但执行了代码
  • @Alexandru 用正确的 Python 调用它是什么意思?我从终端调用程序没有问题。当我在 IDLE 中运行它时(按 F5),它只是不执行。它会默默地崩溃。通过玩弄 subprocess.run 和 subprocess.call,我偶尔会收到关于 /usr/bin/env python3 不是目录的错误...我会仔细阅读 subprocess 模块以解决这个问题。与此同时,从终端一切正常
猜你喜欢
  • 2019-11-08
  • 2011-06-24
  • 1970-01-01
  • 2011-03-28
  • 2020-01-22
  • 1970-01-01
  • 2012-03-06
  • 2018-08-21
  • 1970-01-01
相关资源
最近更新 更多