【问题标题】:Python, os.system fails when script not in same folder当脚本不在同一文件夹中时,Python,os.system 失败
【发布时间】:2012-01-27 12:59:57
【问题描述】:

我有一个包含以下命令的 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 命令来冻结和执行,但上面的错误是我尝试此操作时返回的内容

更新:

如果从标准 python 解释器运行,它似乎正在运行 'os.system('bat.bat') 或子进程等效成功执行 .bat 文件。所以只有从Pydev运行才会不成功

【问题讨论】:

  • setup.py 在哪里?您需要 a) 将 setup.py 的完整路径放入您的 bat.bat 或 b) 将包含 setup.py 的文件夹添加到您的 PATH 变量中(在 Linux 中:export PATH=$PATH:/path/to/folder/containing/setuppy)。
  • 这似乎是真正的灾难鸡尾酒。我正在尝试从 pydev 运行一个 bat 文件。正常工作。但我想让 bat 文件执行 cx_freeze 来冻结另一个程序。我已经解决并继续通过上述错误,但遇到了另一个我将在上面添加的错误
  • 我在 Mac OS X 上遇到了与 Pydev 非常相似的问题——一个在终端的 Python 解释器中运行良好的外部命令,但在 Pydev 中却没有。我对了解出了什么问题以及如何解决问题非常感兴趣。

标签: python subprocess pydev os.system


【解决方案1】:

我创建了一个解决方法,它实际上比我原来的问题更实用和高效。我会接受这个答案,直到解决原来的问题

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

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

【讨论】:

    【解决方案2】:

    在 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,您也可以不带扩展名运行脚本(不推荐)。

    【讨论】:

    • setup.py 没有从解释器执行,我也不想要它。 .bat 文件正在从解释器中执行。 setup.py 是 cx_freeze 命令的一部分(位于 .bat 文件内),用于调用 cx_freeze 以冻结 exe。我也更新了原帖。谢谢
    • 既然你提到了它,导致我的新错误的第一行是 'E:\Deepthroat\FPtest\retryURL\Temp_installed>setup.py build'... 它不应该是 'E :\App\FPtest\retryURL\Temp_installed>bat.bat' .bat 文件应该从解释器执行
    • @Rhys,其实你找错地方了。当您运行批处理文件并尝试在没有 python 解释器作为前缀的情况下调用“setup.py”时,Bat 文件得到正确执行,Windows 尝试查找 py 与任何打开命令的关联。这是它尝试搜索 setup.py 并找不到它的地方。
    • 但它怎么会失败,因为当在没有解释器的情况下手动运行.bat文件时,它可以完美运行。
    • 我刚刚发现,如果运行 os.system,运行 'os.system('bat.bat') 或等效子进程会成功执行 .bat(并且 bat 文件也会成功执行)来自标准的python解释器。只是在使用 Pydev 时不成功
    【解决方案3】:

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

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

    【讨论】:

    • 谢谢,我开始对“坚持更容易”这件事有点困惑,这不是你的错,我对此不熟悉-抱歉
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 2016-06-30
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多