子进程运行Python时出现导入错误
我正在尝试通过一个 Python 程序来运行另一个 Python 脚本,方法是使用 subprocess(原因是主程序在脚本运行时必须已经退出,这涉及到 wx.CallAfter 和 Close 的组合)。但是当脚本运行时,我在第一行遇到了一个错误,提示 ImportError: No module named os
,这让我觉得可能和 Python 的路径设置有关,但我在终端中运行这个脚本时没有问题。
为什么以这种方式运行时,脚本看不到任何核心模块呢?
补充说明:
出问题的那一行是:
wx.CallAfter(subprocess.Popen,'python %s "%s" %s %s'%(os.path.join(BASE_DIR,"updatecopy.py"),BASE_DIR,pos[0],pos[1]),shell=True)
BASE_DIR 只是脚本所在的目录。
2 个回答
0
也许你可以用 os.execv
来代替 Popen。
来自 os/python 文档:
这些函数会执行一个新的程序,替换掉当前的进程;它们不会返回。 在 Unix 系统上,新的可执行文件会被加载到当前进程中,并且会和调用者有相同的进程 ID。错误会以 OSError 异常的形式报告。
(强调是我加的)
1
subprocess这个模块是因为os.exec*已经不推荐使用了,所以我不建议像有人提到的那样用它来替代Popen。
我发现这个问题在运行一个“冻结”的程序时会出现。如果是这种情况,你很可能会继承一个奇怪的环境给新的python进程。
大多数冻结的脚本都是从一个zip文件中运行的,这样的话,Python找不到任何东西也就不奇怪了,因为所有东西都被困在zip文件里了 :)
如果真是这样的话,试着用你运行这个冻结脚本时用的python可执行文件来运行。这样应该能处理这个特殊的环境。