Python,os.system在脚本不在同一文件夹时失败
我有一个名为 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 个回答
看起来你的路径变量里没有包含这两个命令。试着把这两个脚本所在的文件夹添加到你的PATH环境变量里。
在Windows系统中,你可以通过右键点击“我的电脑” -> “属性” -> “高级”(在Windows 7的左侧面板) -> “环境变量”来做到这一点。其实,把路径直接放在前面更简单,确保在你添加的内容和路径变量的开头之间有一个分号(;),而且一定要记得不要删除原本已经存在的内容。
在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环境变量中,你也可以在没有后缀的情况下运行这个脚本(不推荐这样做)。
我找到了一种替代的方法,实际上比我最开始的问题更实用、更高效。在我解决原来的问题之前,我会先接受这个答案。
与其使用一个 .bat 文件,不如把 .bat 文件里的内容放到一个 .py 文件的子进程里,这样就能正常工作了。
代码示例:
import subprocess
subprocess.Popen('python -E setup.py build')