Python,os.system在脚本不在同一文件夹时失败

2 投票
3 回答
3085 浏览
提问于 2025-04-17 08:59

我有一个名为 bat.bat 的文件,里面有一个命令:'setup.py build'

我有一个脚本用来执行这个 bat 命令,代码是:
os.system('E:/bla/FPtest/retryURL/Temp_installed/bat.bat'

如果我在和 bat.bat 文件同一个文件夹里运行这个脚本,它就能正常工作。

但是如果我在其他任何文件夹里运行,就会出现以下错误。

**'setup.py'** is not recognized as an internal or external command, operable program or batch file.

我也试过用 subprocess.Popen,结果也是一样,不过它在最上面还加了这一行:C:\Eclipse\Workspace\example>setup.py build ... 嗯 ...

更新:

我决定在 bat.bat 文件所在的目录里运行 os.system 命令(这个目录也是存放 setup.py 的地方)。

现在调用应该简单多了。

import os
os.system('bat.bat')     note: (run from pydev)

结果:

E:\App\FPtest\retryURL\Temp_installed>setup.py build 
Traceback (most recent call last):
  File "C:\Python31\lib\site.py", line 56, in <module>
    import os
  File "C:\Python31\lib\os.py", line 380, in <module>
    from _abcoll import MutableMapping  # Can't use collections (bootstrap)
  File "C:\Python31\lib\_abcoll.py", line 49
    class Hashable(metaclass=ABCMeta):
                            ^
SyntaxError: invalid syntax

补充说明:

如果我运行任何“简单”的 .bat 文件,一切都正常。如果我在解释器外部运行这个 .bat 文件,也能正常工作 ... 这让我觉得问题出在 .bat 文件的内容上,内容是:setup.py build
在这种情况下,.bat 文件的内容执行了一个 cx_freeze 命令来生成 exe 文件,但当我尝试这样做时,返回的就是上面的错误。

更新:

看起来从标准的 Python 解释器运行 os.system('bat.bat') 或者相应的 subprocess 方法可以成功执行 .bat 文件。所以只有在 Pydev 中运行时才会失败。

3 个回答

0

看起来你的路径变量里没有包含这两个命令。试着把这两个脚本所在的文件夹添加到你的PATH环境变量里。

在Windows系统中,你可以通过右键点击“我的电脑” -> “属性” -> “高级”(在Windows 7的左侧面板) -> “环境变量”来做到这一点。其实,把路径直接放在前面更简单,确保在你添加的内容和路径变量的开头之间有一个分号(;),而且一定要记得不要删除原本已经存在的内容。

3

在Windows 2000及以后的版本中,.py这个文件后缀是和一个命令关联的,这个命令会运行Python解释器。这个关联是在安装时就设置好的。不过,要通过解释器来运行Python脚本,脚本要么得在当前目录下,要么得在系统环境变量中指定的某个目录里。

在你的情况下,如果setup.py文件在某个地方,并且这个路径是绝对路径,你可以这样做:

path=%path%;<directory containing setup.py>

另一方面,如果setup.py文件在一个相对路径下,也就是不是绝对路径,你需要从当前的批处理文件位置指定完整的相对路径。像这样:

..\<sub directory>\setyp.py #If the script is below the current path

或者

.\<sup directory>\setyp.py #If the script is above the current path

注意*** 如果.py在PATHEXT环境变量中,你也可以在没有后缀的情况下运行这个脚本(不推荐这样做)。

0

我找到了一种替代的方法,实际上比我最开始的问题更实用、更高效。在我解决原来的问题之前,我会先接受这个答案。

与其使用一个 .bat 文件,不如把 .bat 文件里的内容放到一个 .py 文件的子进程里,这样就能正常工作了。

代码示例:
import subprocess
subprocess.Popen('python -E setup.py build')

撰写回答