【问题标题】:Problems running batch files with Python使用 Python 运行批处理文件时出现问题
【发布时间】:2018-12-14 09:00:53
【问题描述】:

我对 Python 比较陌生,一直在尝试用它运行一个 .cmd 文件,但它不会从正确的位置运行它。我的文件 Run_setup.cmd 正在使用一堆相关文件设置另一个不同的软件,因此为了我的理智,我已将它们隔离到自己的文件夹中。

目前我可以让 .cmd 文件从与我的源代码相同的位置运行。根据文档的内容,我知道我用 cwd=r'%s' 弄乱了它的文件路径,但我不明白怎么做。

如果 cwd 不是 None,该函数会在执行子进程之前将工作目录更改为 cwd。 cwd 可以是 str 和类似路径的对象。特别是,如果可执行路径是相对路径,该函数会查找相对于 cwd 的可执行文件(或 args 中的第一项)。

我目前使用基于this postcwd=r' C:\LargeFolder\Files\CorrectFolder',它似乎适用于任何文件路径,但我不能似乎让它对我有用。

from subprocess import Popen

def runCmdfile():
    # File Path to source code:    'C:\LargeFolder\Files'
    myDir = os.getcwd()

    # File Path to .cmd file:      'C:\LargeFolder\Files\CorrectFolder'
    myDir = myDir + '\CorrectFolder'

    runThis = Popen('Run_setup.cmd', cwd=r'%s' % myDir)

    stdout, stderr = runThis.communicate()

我在这里缺少什么,以及使用 cwd=r' ' 的目的是什么?

【问题讨论】:

标签: python batch-file subprocess popen


【解决方案1】:

这个对我有用:

def runCmdfile():
    # File Path to source code:    'C:\LargeFolder\Files'
    myDir = os.getcwd()

    # File Path to .cmd file:      'C:\LargeFolder\Files\CorrectFolder'
    myDir = os.path.join(myDir, 'CorrectFolder')

    # Popen does not take cwd into account for the file to execute
    # so we build the FULL PATH on our own
    runThis = Popen(os.path.join(myDir, 'Run_setup.cmd'), cwd=myDir)

    stdout, stderr = runThis.communicate()

【讨论】:

    【解决方案2】:

    参数为cwd=r"" 部分只需要存在于您的字符串的定义中,拥有一个原始字符串并使 python 使用反斜杠忽略特殊序列。

    由于您的字符串来自os.getcwd,因此您不需要它。

    def runCmdfile():
        # File Path to source code:    'C:\LargeFolder\Files'
        myDir = os.getcwd()
    
        # File Path to .cmd file:      'C:\LargeFolder\Files\CorrectFolder'
        myDir = os.path.join(myDir, 'CorrectFolder')
    
        runThis = Popen('Run_setup.cmd', cwd=myDir)
    
        stdout, stderr = runThis.communicate()
    

    【讨论】:

    • 使用您的代码时,我不断收到错误“FileNotFoundError: [WinError 2] 系统找不到指定的文件”。我不知道为什么它找不到文件,因为我已经确认它在正确的文件夹中。
    • @NeverSundae 在runThis ... 之前的print(myDir) 真的显示了正确的路径吗?您甚至可以尝试使用print('*'+myDir+'*') 来检测前导/尾随空格等。
    • @ack 我尝试按照您的建议打印,但没有空白。
    • @nosklo 我似乎已经解决了我的问题,有人知道为什么这似乎有效吗?:runThis = Popen('C:\LargeFolder\Files\CorrectFolder\Run_setup.cmd')
    【解决方案3】:

    您的错误是由于没有转义您的 \. 您需要转义要在子文件夹中添加的“\”,然后就可以开始了。

    myDir = myDir + '\CorrectFolder'
    

    应该是

    myDir = myDir + '\\CorrectFolder'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-02
      • 2015-01-07
      • 2011-08-19
      • 2020-03-30
      • 1970-01-01
      相关资源
      最近更新 更多