“WindowsError:[错误2]系统找不到指定的文件”未解析

时间:2013-09-12 06:41:15

标签: python gtk pygtk

我已经通过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"])

提前致谢

1 个答案:

答案 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中)包含该脚本。