我已经通过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
Run Code Online (Sandbox Code Playgroud)
我知道这是重复的问题,但我尝试了很多stackoverflow的解决方案,但我没有解决这个问题.有人帮我解决这个问题.
并且在成功登录后,它将通过此代码转到start.py文件,但它不会出现并给出上述错误.
subprocess.call(["python", "./start.py"])
Run Code Online (Sandbox Code Playgroud)
提前致谢
这里至少有两个问题。
首先,您不能仅用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])
Run Code Online (Sandbox Code Playgroud)
最后一件事:根据您的评论,我什至不确定您实际上是否真的捆绑start.py到您的可分发包中。在你的机器上,它工作的地方,它显然在C:\Python27\start.py. 但是在您正在测试的机器上……它存在于任何地方吗?如果没有,您显然无法运行它。
像这样的工具py2exe可以自动找到您的依赖项import,但是如果您只是通过在不同的解释器实例中运行脚本subprocess,则您将不得不告诉它(在您的 中setup.py)包含该脚本。
| 归档时间: |
|
| 查看次数: |
48931 次 |
| 最近记录: |