这里至少有两个问题。
首先,你不能只使用python
作为可执行文件。
在你的系统上,你有python
on the %PATH%
,这是rightPython 版本,包含您依赖的所有模块等。但您不能为所有用户依赖它。如果可以的话,你就不会打扰py2exe
首先。
显然,在您正在测试的另一台机器上,根本没有任何名称python
on the %PATH%
,所以你会得到一个 WindowsError 2。
无论如何,你想与same您的脚本正在使用的 Python。
与此同时,没有理由期待start.py
位于当前工作目录中。它(希望)与父脚本位于同一目录中,但这不会是工作目录。通常,Windows 程序以 C:\ 或 WINNT 目录或用户主目录等启动,并且每个版本的情况都不同。
当然,在开发过程中,您会使用命令提示符,并在每次运行脚本时将脚本的目录作为工作目录,或者使用可以有效执行等效操作的 IDE。所以它恰好起作用了。但当从 .exe 运行时,你就不能指望它了。
(这个调试起来会更有趣。子进程将成功启动并立即完成,而不做任何可见的事情。您的父脚本将不知道出了什么问题,因为您没有检查退出代码或标准错误,这将使调试变得很有趣。你真的应该使用check_call
, not 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
)以包含该脚本。