2015-12-05 73 views
0

我打电话另一个程序使用了一段代码,看起来像这样:Python的2.7到3.4版本子过程

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 

“/包/箱/程序”呼吁从在这里包装的另一个文件,我认为这是核心问题的相关性。我打电话给3.4中正常工作的其他程序。

3.4中有什么变化可能导致这种情况?

(对不起,隐藏代码 - 我打电话给公司内部工具,我不能在这里公开)。

+0

文件'bin/program'是否存在于当前工作目录中? – falsetru

+0

我假设'bin/program'是一个Python 2.7应用程序?也许在你传递给子进程的环境中有一些东西会导致它在模块的3.4路径中查找。检查'os.environ'中的内容,尤其是PYTHONPATH。你也可以看看'bin/package'中的第一行,看它的“shebang”是否指向右边的python。 – tdelaney

+0

噢,我假设你没有在虚拟环境中这样做? – tdelaney

回答

1

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

下面是一个例子:

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

OP的问题是''程序'导入其他模块。我看不到当前的工作目录是如何涉及的。 – tdelaney

+0

@tdelaney因为从我所看到的,除了在Popen中没有任何进口。所以他必须在Popen中运行一个Python脚本,并且该脚本导入了一些东西。在那种情况下......他发布的代码是无关紧要的。 –

+0

'程序'输入的东西。但不管怎样,cwd都没有涉及。 – tdelaney

0

上述评论一直在探索的问题有帮助的,但在这一天结束,这似乎是一些权限冲突 - 添加一个命令修复之前sudo -u <user>问题。仍然不清楚为什么Py3需要这个,而Py2不需要,但也许我需要更密切地与其他内部用户探讨这个问题。

谢谢!