【问题标题】:Python 2.7 to 3.4 Subprocess IssuePython 2.7 到 3.4 子进程问题
【发布时间】:2015-12-05 02:58:18
【问题描述】:

我正在使用如下所示的一段代码调用另一个程序:

import subprocess
lc="/package/bin/program --do stuff"
command_list = lc.split()
ljs=subprocess.Popen(command_list,stdout=subprocess.PIPE)
ljs.communicate()[0]

字符串在 UNIX 命令行中运行良好,代码在 Python 2.7 中运行。但是,在 Python 3.4 中,我收到如下错误:

File "/package/bin/program", line 2, in <module>
    from package import module
ImportError: No module named package

"/package/bin/program" 在这里从包中的另一个文件调用依赖项,我认为这是核心问题。我调用了在 3.4 中运行良好的其他程序。

3.4 中的哪些更改可能导致此问题?

(对于神秘的代码,提前抱歉 - 我正在调用公司内部工具,我不能在这里公开)。

【问题讨论】:

  • 文件bin/program是否存在于当前工作目录中?
  • 我假设bin/program 是python 2.7 应用程序?也许您传递给子进程的环境中有一些东西导致它在 3.4 路径中查找模块。检查 os.environ 中的内容,尤其是 PYTHONPATH。您还可以查看bin/package 中的第一行,看看它的“shebang”是否指向正确的 python。
  • 哦,我假设您不是在虚拟环境中执行此操作?
  • @falsetru 不,但我正在调用整个路径。更新帖子。
  • @tdelaney 你是对的,目标应用程序是 2.7。让我深入研究一下。谢谢!

标签: python python-2.7 python-3.x subprocess


【解决方案1】:

问题是子进程实例的工作目录默认是bash shell的目录。要设置新的工作目录,请将 Popen 中的 cwd 参数设置为您的工作目录。

这是一个例子:

subprocess.Popen(['random' '--command'], stdout = subprocess.PIPE, cwd='C:/Path/To/Working/Directory/')

【讨论】:

  • OP 的问题在于 program 导入其他模块。我看不到当前工作目录是如何参与的。
  • @tdelaney 因为据我所知,除了在 Popen 中没有导入。所以他必须在 Popen 中运行 Python 脚本,并且脚本会导入东西。在那种情况下......他发布的代码是无关紧要的。
  • program 进口东西。但无论如何,不​​涉及 cwd。
  • @tdelaney 所以这意味着我们无法在不查看公司代码的情况下进行调试,而且我的回答是无关紧要的。
【解决方案2】:

以上评论有助于探索该问题,但归根结底,这似乎是一些权限冲突 - 在命令修复问题之前添加 sudo -u &lt;user&gt;。仍然不清楚为什么 Py3 需要这个而 Py2 不需要,但也许我需要与其他内部用户更密切地探讨这个问题。

谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-30
    • 2015-09-05
    • 2015-06-15
    • 2015-08-02
    • 1970-01-01
    • 2018-02-04
    • 2017-07-13
    相关资源
    最近更新 更多