我正在尝试使用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如何设置环境变量。
显然,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使我走上正确的道路。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句