217

有没有办法在 Python 中指定命令的运行目录subprocess.Popen()

例如:

Popen('c:\mytool\tool.exe', workingdir='d:\test\local')

我的 Python 脚本位于C:\programs\python

是否可以C:\mytool\tool.exe在目录中运行D:\test\local

如何设置子进程的工作目录?

4

2 回答 2

320

subprocess.Popen 接受一个cwd参数来设置当前工作目录;您还需要转义反斜杠 ( 'd:\\test\\local'),或使用r'd:\test\local'这样反斜杠不会被 Python 解释为转义序列。按照您编写的方式,该\t部分将被翻译成tab.

因此,您的新行应如下所示:

subprocess.Popen(r'c:\mytool\tool.exe', cwd=r'd:\test\local')

要将 Python 脚本路径用作 cwd,import os并使用以下命令定义 cwd:

os.path.dirname(os.path.realpath(__file__)) 
于 2009-11-06T03:10:03.240 回答
1

另一种方法是简单地做到这一点

cwd = os.getcwd()
os.chdir('c:\some\directory')
subprocess.Popen('tool.exe')
os.chdir(cwd)

如果您想依赖相对路径,例如,如果您的工具的位置是c:\some\directory\tool.exe. cwdfor 的关键字参数Popen不会让你这样做。一些脚本/工具可能依赖于您在调用它们时位于给定目录中。为了减少这段代码的噪音,也就是将与更改目录相关的逻辑从“业务逻辑”中分离出来,您可以使用装饰器。

def invoke_at(path: str):
    def parameterized(func):
        def wrapper(*args, **kwargs):
            cwd = os.getcwd()
            os.chdir(path)

            try:
                ret = func(*args, **kwargs)
            finally:
                os.chdir(cwd)

            return ret

        return wrapper

    return parameterized            

然后可以以某种方式使用这样的装饰器:

@invoke_at(r'c:\some\directory')
def start_the_tool():
    subprocess.Popen('tool.exe')
于 2022-01-12T13:09:43.970 回答