我已经通过py2exe创建了我的python项目的exe文件,其中包含多个文件。 当我在我的系统中运行此exe文件。它工作正常,但如果我把它放在另一个系统,然后它打开登录表单,然后它没有进入我在第二个python文件中写入的下一个窗口。它在日志文件中给出了以下错误。
Traceback (most recent call last):
File "login.py", line 246, in DataReader
File "subprocess.pyo", line 711, in __init__
File "subprocess.pyo", line 948, in _execute_child
WindowsError: [Error 2] The system cannot find the file specified
我知道这是重复的问题,但我尝试了很多stackoverflow的解决方案,但我没有解决这个问题。有人帮我解决了这个问题。
登录成功后,将通过此代码转到start.py文件,但它不会出现上述错误。
subprocess.call(["python", "./start.py"])
提前致谢
答案 0 :(得分:4)
这里至少有两个问题。
首先,您不能只使用python
作为可执行文件。
在您的系统上,python
上有%PATH%
,而正确的 Python版本,包含您依赖的所有模块等等。但是你不能依赖于所有用户。如果可以的话,你首先不会打扰py2exe
。
显然,在你正在测试的另一台机器上,python
上没有任何名为%PATH%
的内容,因此你得到一个WindowsError 2。
无论如何,您希望使用脚本正在使用的相同的 Python运行。
同时,没有理由期望start.py
在当前的工作目录中。它(希望)与父脚本在同一目录中,但可能不是工作目录。通常情况下,Windows程序会以C:\或WINNT目录或用户的主目录启动,并且版本与版本不同。
当然,在开发过程中,您通常会使用命令提示符,只要您运行脚本,脚本的目录就是您的工作目录,或者您正在使用有效执行等效操作的IDE。所以它恰好工作。但是当从.exe运行时,你不能指望它。
(这个调试会更有趣。子进程将成功启动并立即完成,而不会显示任何内容。您的父脚本将不知道出现任何问题,因为您没有检查退出代码或stderr,这将使调试变得非常有趣。你真的应该使用check_call
,而不是call
。)
无论如何,如果您希望脚本找到与其自身位于同一目录中的另一个脚本,则需要明确说明。
所以,要解决这两个问题:
import os
import sys
mypath = os.path.abspath(__file__)
mydir = os.path.dirname(my_path)
start = os.path.join(mydir, "start.py")
subprocess.call([sys.executable, start])
最后一件事:从您的评论中,我甚至不确定您是否真的将start.py
捆绑到您的可分发包中。在你的机器上,它工作的地方,显然在C:\Python27\start.py
。但是在你正在测试的机器上......是否存在于任何地方?如果没有,你显然无法运行它。
像py2exe
这样的工具可以自动找到您import
的依赖关系,但如果您只是通过subprocess
在不同的解释器实例中运行脚本,那么您将不得不告诉它(在你的setup.py
中)包含该脚本。