【问题标题】:Subprocess Popen to run python command子进程 Popen 运行 python 命令
【发布时间】:2018-08-30 16:37:41
【问题描述】:

我需要在 Popen 中运行 python 命令。问题是命令需要在 python3 中运行并且我需要它是可移植的,这意味着我不能在每种情况下都使用 python3 别名......

我的计算机中python 已经是正确的版本,而其他计算机的正确版本是python3。我尝试在文件开头插入#!/usr/bin python3,然后以python 运行,但没有成功。

我无法修改环境变量以将 python3 更改为 python。我想知道是否有一种方法可以检查我需要使用哪个,或者只有在 Popen 命令中才能将 python3 更改为 python...

我尝试运行的 Popen 命令非常简单,不,我不能只导入文件并用作类...它需要通过 Popen 运行。此外,virtualenv 或类似的也不是一个选项。

subprocess.Popen(['python', 'main.py'], shell=True, universal_newlines=True)

【问题讨论】:

  • shell=True 在这里破坏了您的代码:它运行的内容等同于命令 sh -c 'python' 'main.py';您可以在 shell 中测试它在那里也不起作用(因为只有紧接在 -c 之后的参数被视为 shell 脚本;之后的参数变为 $0$1 等,但该脚本没有t 寻找它们,因此它们被忽略)- 而使用 shell=False,您运行的内容相当于(shell 命令)python main.py
  • @CharlesDuffy 真的吗?您可以直接从控制台运行python main.py 吗?
  • python main.py 在 shell 提示符下工作,sh -c python main.py 不工作(对于“不起作用”的值,其中 main.py 参数被忽略)
  • 你也可以在交互式shell中通过比较echo hellosh -c echo hello来测试这个;在sh -c -- 由 Python 的 shell=True 添加 -- 前面,hello 被忽略,只有一个空行是 echoed。
  • ...无论如何,转向您的主要问题:如果您已经在必要的平台上将 shebang 更改为 #!/usr/bin/python3,那么剩下的唯一必要的事情就是运行 /path/to/yourscript而不是python /path/to/yourscript,所以shebang很荣幸。所以subprocess.Popen(['./main.py']) 将尊重#!/usr/bin/python3#!/usr/bin/python#!/usr/bin/env python3 或任何它。

标签: python python-3.x subprocess popen


【解决方案1】:

shebang -- 显示要使用的解释器的初始行,例如 #!/usr/bin/python#!/usr/bin/python3 -- 仅在您自己没有明确选择解释器时才有效:如果您运行 python foo.py,操作系统正在调用特定的 Python 解释器并将其传递给 foo.py 作为参数(它解释为它应该运行的脚本的名称);而当您运行./foo.py 时,您是在告诉操作系统本身找出使用哪个解释器来运行foo.py,它通过查看shebang 来做到这一点。

要让操作系统自行选择,只需明确指定脚本的名称即可:

subprocess.Popen(['./main.py'], universal_newlines=True)

【讨论】:

  • 它只能在 mac 上运行...甚至 windows 上的“shell=True”也不起作用...'.' is not recognized as an internal or external command, operable program or batch file 任何想法?
  • 如果 PyLauncher 工具可用并且在 PATH 中,您应该能够在 Windows 上使用 py -3 main.py。请参阅bitbucket.org/pypa/pylauncher——据我了解,它与 Python 3 一起提供了开箱即用的功能。不过,Windows 不是我的本机平台,所以请对我所说的一切持保留态度。
  • 另见PEP-0397,描述了Windows 上的py 命令——除其他外,它旨在能够读取shebang(通常仅适用于UNIX)并发送到适当的Python 安装。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-22
  • 1970-01-01
  • 2015-10-29
  • 2016-03-07
  • 2020-07-25
  • 2021-12-07
相关资源
最近更新 更多