通过子进程从另一个python脚本调用python脚本时导入错误的包

时间:2014-09-18 12:54:19

标签: python import subprocess pydev cx-freeze

我正在尝试使用cx_Freeze为32位和64位的程序自动执行可执行文件创建。我有两个单独的python 3.4安装(32位和64位)以及所有必需的包,它们都对应于它们适当的体系结构。

但是,当我执行通过子进程调用不同python安装的脚本时,被调用的python子进程导入错误的包。他们两者导入包,调用原始脚本,并且在子进程中调用的python安装包。

使用64位python调用的最小示例:

#! coding=utf-8
import subprocess as sp
sp.call(["python34-32","test.py"])
sp.call(["python34","test.py"])

test.py只包含以下行:

import cx_Freeze

第二个进程,也调用64位python不会有问题。但是32位会抛出以下错误:

ImportError: DLL load failed: %1 is not a valid Win32 application.

这是因为调用32位python的子进程从64位python导入cx_freeze。情况也可以逆转。当使用32位python执行主脚本时,会发生同样的错误,但现在是因为在suprocess中调用的64位python正在导入32位冻结包。

如何停止此行为并告诉它从相应的来源导入?

我使用Windows 7 x64和PyDev作为IDE,如果它是相关的,它可能是。

编辑:显然,当从源目录中的命令行执行主脚本时,它可以正常工作。感谢下面的评论,我想问题就是PyDev如何设置环境变量。

1 个答案:

答案 0 :(得分:3)

显然PyDev设置了环境变量PYTHONPATH,这是两个子进程用来加载包的路径。

如果我在64位python中执行以下脚本:

#! coding=utf-8
import subprocess as sp

sp.call(["python34-32", "test.py"])

test.py包含以下行:

import os
print(os.getenv("PYTHONPATH"))

结果显示了为64位python安装设置的标准文件夹。

我的猜测是,我必须在调用32位python之前更改PYTHONPATH变量。有谁知道怎么做?

编辑:在子进程的环境中更改PYTHONPATH变量就可以了。在64位python中执行以下操作

#! coding=utf-8
import subprocess as sp
import os

env = os.environ
env["PYTHONATH"] = "{INSERT FOLDERS TO 32bit PYTHON}"
sp.call(["python34-32", "test.py"], env=env)

感谢bakuriu让我走上正轨。