使用popen和当前env启动新的python子进程包含模块导入,给出ImportError

时间:2014-01-24 00:23:44

标签: python subprocess popen env

我正在尝试使用以下代码将python程序作为子进程启动,但子进程将ImportErrors输出到stderr。

代码

import subprocess
import sys
import os

environment = os.environ

command = ["python", "-u", "/test/my_python_program.py"]
p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, env=environment)

for line in iter(p.stdout.readline, ''):
    line = line.replace('\r', '').replace('\n', '')
    print line
    sys.stdout.flush()

错误

Traceback (most recent call last):
  File "/test/my_python_program.py", line 31, in <module>
    from PySide import QtGui, QtCore, QtNetwork
ImportError: dlopen(/Applications/Autodesk/maya2014/Maya.app/Contents/Frameworks/Python.framework/Versions/Current/lib/python2.7/site-packages/PySide/QtGui.so, 2): Library not loaded: @executable_path/libpyside-python2.7.1.1.dylib
  Referenced from: /Applications/Autodesk/maya2014/Maya.app/Contents/Frameworks/Python.framework/Versions/Current/lib/python2.7/site-packages/PySide/QtGui.so
  Reason: image not found

我正在从嵌入到另一个程序(Autodesk Maya)的python版本中运行我的代码。导致ImportError的模块可从主进程python解释器导入。我的假设是我可以将主进程的python的env提供给子进程,以便它可以访问主python实例也可以访问的模块。

这种方法有意义吗?如果是的话,我做错了什么?

EDIT1

我还尝试使用popen调用中使用的嵌入式python版本,但错误仍然存​​在。如果我删除导入嵌入版本的python运行就好了。

编辑2

这些是os.environ返回的环境变量

MAYA_MODULE_PATH
AUTOLOADER_LAPS
LOGNAME
USER
SUBSTANCES_LOCATION
PATH
HOME
MAYA_SCRIPT_BASE
MENTALRAY_INCLUDE_LOCATION
SHELL
MAYA_LICENSE_METHOD
MAYA_LICENSE
QT_MAC_NO_NATIVE_MENUBAR
MAYA_SCRIPT_PATH
MAYA_REVERSE_FILEFORMAT_EXT
WF_IMF_CIN_WHITE_POINT
MAYA_LOCATION
PYTHONPATH
SSH_AUTH_SOCK
MENTALRAY_SHADERS_LOCATION
Apple_PubSub_Socket_Render
MAYA_PRESET_PATH
XBMLANGPATH
MAYA_RENDER_DESC_PATH
MAYA_SHADER_LIBRARY_PATH
MENTALRAY_LOCATION
TMPDIR
__KMP_REGISTERED_LIB_5123
MAYA_PLUG_IN_PATH
MAYA_APP_DIR
PYTHONHOME
MAYA_PLUG_IN_RESOURCE_PATH
__CF_USER_TEXT_ENCODING
IMF_PLUG_IN_PATH
__CHECKFIX1436934
WF_IMF_CIN_CORRECTION

编辑3

以下是PYHOME

的内容
/Applications/Autodesk/maya2014/Maya.app/Contents/Frameworks/Python.framework/Versions/Current

1 个答案:

答案 0 :(得分:1)

在Maya中运行的Python并不是完全标准的......

从Maya中运行时,您可能需要使用mayapy命令launch Python。这根据Autodesk的要求引导Python,并应确保运行Python所需的环境是正确的。 (虽然我认为这可能是你在Edit1中提到的内容)。

您是否也尝试过不通过环境到popen命令?我认为popen的默认行为是继承当前进程的环境,这就是你想要的。我希望环境在某个时刻设置DYLD_LIBRARY_PATH和/或DYLD_FRAMEWORK_PATH,告诉它Qt在哪里。