7

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

提前致谢

4

1 回答 1

5

这里至少有两个问题。


首先,您不能只python用作可执行文件。

在您的系统上,您已经python安装了%PATH%,它是正确的Python 版本,包含您所依赖的所有模块等。但您不能对所有用户都依赖它。如果可以的话,你py2exe一开始就不会打扰。

显然,在您正在测试的另一台机器上, 上根本没有任何名称python%PATH%因此您会收到 WindowsError 2。

无论如何,您都希望使用与您的脚本相同的 Python 运行。


同时,没有理由期望start.py在当前工作目录中。它(希望)与父脚本在同一个目录中,但这不是工作目录。通常,Windows 程序以 C:\ 或 WINNT 目录或用户的主目录之类的东西启动,并且每个版本都不同。

当然,在开发过程中,您使用的是命令提示符,每当您运行脚本时,脚本的目录就作为您的工作目录,或者您使用的 IDE 可以有效地执行等效操作。所以它恰好起作用。但是当从 .exe 运行时,你不能指望它。

(这个调试起来会更有趣。子进程将成功启动并立即完成,而不做任何可见的事情。你的父脚本不会知道有什么问题,因为你没有检查退出代码或标准错误,这将使调试变得很有趣。你真的应该使用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)中包含该脚本。

于 2013-09-12T07:09:49.233 回答