是否有一种方法可以在Python的subprocess.Popen()中指定命令的运行目录?

例如:

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

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

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

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


当前回答

另一种方法是简单地这样做

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

如果您希望依赖于相对路径,则此解决方案有效,例如,如果您的工具的位置是c:\some\directory\tool.exe。Popen的cwd关键字参数将不允许您这样做。有些脚本/工具可能依赖于您在调用它们时处于给定目录。为了使这段代码不那么嘈杂,也就是从“业务逻辑”中分离与更改目录相关的逻辑,您可以使用装饰器。

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')

其他回答

另一种方法是简单地这样做

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

如果您希望依赖于相对路径,则此解决方案有效,例如,如果您的工具的位置是c:\some\directory\tool.exe。Popen的cwd关键字参数将不允许您这样做。有些脚本/工具可能依赖于您在调用它们时处于给定目录。为了使这段代码不那么嘈杂,也就是从“业务逻辑”中分离与更改目录相关的逻辑,您可以使用装饰器。

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')

子流程。Popen接受cwd参数来设置当前工作目录;你还需要转义反斜杠('d:\\test\\local'),或者使用r'd:\test\local',这样反斜杠就不会被Python解释为转义序列。按照您编写的方式,\t部分将被转换为制表符。

所以,你的新行应该是这样的:

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

要使用Python脚本路径作为cwd,请导入os并使用以下命令定义cwd:

os.path.dirname(os.path.realpath(__file__))