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

时间:2011-12-25 05:41:14

标签: python subprocess pydev 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 ... mmmmmm ...

更新

我决定参加比赛 os.system命令保存在bat.bat文件所在的目录中(这也是存储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')或子进程等效成功执行.bat文件。所以如果从Pydev

运行它只是不成功

3 个答案:

答案 0 :(得分:3)

在Windows 2000及更高版本中,.py扩展名与运行解释程序的打开命令相关联。这实际上是在安装期间完成的。但是为了通过解释器运行python脚本,脚本应该在当前目录中,或者应该位于路径环境变量中连接的目录之一。

在你的情况下,如果setyp.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

注意***如果PATHEXT环境变量中存在.py,您也可以在没有扩展名的情况下运行脚本(不推荐)。

答案 1 :(得分:0)

看起来你的路径变量不包含任何一个命令。尝试将PATH环境变量添加到两个脚本所在的目录中。

在Windows中,您可以通过右键单击“我的电脑” - >执行此操作;属性 - &gt;高级(Windows 7中的左窗格) - &gt;环境变量。只需将路径固定在前面并确保有一个;在您的条目和路径变量的开头之间......不要删除那些已经存在的内容。

答案 2 :(得分:0)

我创造了一个解决方案,这比我原来的问题更实际,更有效。在解决原始问题之前,我会接受这个答案

而不是使用.bat文件...将.bat文件的内容放在.py子流程中

导入子流程
subprocess.Popen('python -E setup.py build')