“WindowsError:[Error 2]系统找不到指定的文件”无法解决。

8
我使用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"])

感谢您提前的支持。

如果文件在同一目录中,请尝试删除“./”部分。 - Bibhas Debnath
删除后,它仍然在同一目录中给出相同的错误。 - Ashish Jain
1个回答

5
这里至少有两个问题。
首先,你不能仅使用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(mypath)
start = os.path.join(mydir, "start.py")
subprocess.call([sys.executable, start])

最后一件事:从你的评论中,我甚至不确定你是否将start.py实际打包到了可分发的软件包中。在你的机器上,它似乎在C:\Python27\start.py位置。但是在你测试的机器上...它有存在吗?如果没有,你显然无法运行它。

py2exe这样的工具可以自动查找你import的依赖项,但如果你只是通过subprocess在另一个解释器实例中运行脚本,你需要告诉它(在你的setup.py中)包括该脚本。


使用您上面的代码后,同一个登录文件一遍又一遍地被调用。我无法进入start.py,也就是第二个窗口。 - Ashish Jain
我同意你的观点,在另一个系统中它正在搜索%PATH%,但在另一个系统中不可用。第二,我将所有脚本文件包含在安装文件中,因此所有文件都与exe目录一起出现。现在问题是如何解决,因为在使用你的代码后仍然出现相同的错误。 - Ashish Jain
1
感谢abarnert的评论。我已经解决了这个问题,实际上是因为其他系统不理解Python而导致的,因为该系统没有安装Python。所以我用下面这行代码替换了之前的代码:subprocess.call("start.py", shell=True)。 - Ashish Jain
@AshishJain:那不是一个很好的解决方案。使用py2exe的整个目的是能够在没有安装Python(和任何第三方模块)的系统上运行。如果你需要这个,你的解决方案就行不通;如果你不需要这个,你就不应该在第一时间添加py2exe的复杂性;python setup.py bdist --formats=wininst应该就足够了。 - abarnert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接