【问题标题】:subprocess.Popen() won't run python script, python command not foundsubprocess.Popen() 不会运行 python 脚本,找不到 python 命令
【发布时间】:2020-12-16 16:43:56
【问题描述】:

我正在尝试让 subprocess.Popen 运行 python 脚本,但我不断收到以下错误:/bin/sh: python: command not found。该脚本将 yaml 文件作为参数。不管有没有shell=True,我都试过这条线。当我在 Linux 终端中使用 python 命令运行该脚本时,它运行良好。我做错了什么?

    process = subprocess.Popen(
        ['python', PATH_TO_PYTHON_SCRIPT, PATH_TO_CONFIG_FILE],
        stdout=subprocess.PIPE,
        stderr=subprocess.STDOUT, stdin=subprocess.PIPE, shell=True)
    with process.stdout, open(processing_log, 'ab') as f_in:
        for line in iter(process.stdout.readline, b''):
            f_in.write(line)

【问题讨论】:

  • 当您使用 python 可执行文件的完整路径而不仅仅是“python”时它是否有效?即尝试Popen(['/path/to/python.exe', PATH_TO_PYTHON_SCRIPT, ...shell=False。那样有用吗?它可能暗示核心问题是什么。你可以通过在你的linux终端运行which python找到可执行文件的绝对路径
  • 如果您使用shell=True 运行,这将永远起作用,因为除了第一个参数 (python) 之外的所有参数都将被忽略。请注意,python 不在您的 PATH 中,这是一个完全不同的问题。
  • 啊,使用 python exe 的完整路径运行它。 Python 一定不是我想的那样。谢谢!

标签: python subprocess popen


【解决方案1】:

如果您想使用当前正在运行的同一个解释器运行,我建议您传递sys.executable 而不是'python',这样您就不会依赖于PATH 查找的变幻莫测;如果您想从PATH 查找它,您可以尝试using shutil.which 在 Python 层查找它,以尽量减少阻碍的数量。

旁注:你为什么用shell=True 运行这个?这增加了许多您可能应该避免的复杂因素,而且您也没有利用它提供的微小好处。

此外,如果您只想将输出附加到给定文件,您总是可以这样做:

with open(processing_log, 'ab') as f_out:
    process = subprocess.Popen(
        ['python', PATH_TO_PYTHON_SCRIPT, PATH_TO_CONFIG_FILE],
        stdout=f_out,
        stderr=subprocess.STDOUT, stdin=subprocess.PIPE)

让进程直接写入文件,而不是充当透传层。

【讨论】:

    猜你喜欢
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    相关资源
    最近更新 更多