指定popen的工作目录

icn*_*icn 174 python subprocess popen

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

例如:

Popen('c:\mytool\tool.exe', workingdir='d:\test\local')
Run Code Online (Sandbox Code Playgroud)

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

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

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

Mar*_*off 253

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')
Run Code Online (Sandbox Code Playgroud)

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

os.path.dirname(os.path.realpath(__file__)) 
Run Code Online (Sandbox Code Playgroud)

  • 至少在python 3中,即使在Windows机器上也不必使用反斜杠,我只需要`subprocess.call(["C:/Users/Bob/Some.exe"],cwd ="C:/ Users/Jane /")`它运行正常 (12认同)
  • 它也适用于subprocess.check_output().谢谢 ! (9认同)
  • 工作目录必须是绝对路径吗? (7认同)
  • @T.Stone:对于一个独立的可执行文件,它不应该改变任何东西,除非exe依赖于shell中的一些环境变量,也许.但是,使用`shell = False`,你不能使用像`cd`这样的shell内置:即在Linux上用shell尝试这两种方式:`subprocess.Popen("cd/tmp; pwd")` (3认同)
  • 如果有的话,在参数上添加Shell = True对于设置cwd有什么影响呢? (2认同)
  • @ArindamRoychowdhury 文档的说法恰恰相反。“请注意,搜索可执行文件时*不*考虑该目录。”。因此,请始终使用完整路径或相对于当前 python 模块的路径。 (2认同)

ash*_*mun 12

其他方法就是简单地这样做

cwd = os.getcwd()
os.chdir('c:\some\directory')
subprocess.Popen('tool.exe')
os.chdir(cwd)
Run Code Online (Sandbox Code Playgroud)

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

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            
Run Code Online (Sandbox Code Playgroud)

这样的装饰器可以这样使用:

@invoke_at(r'c:\some\directory')
def start_the_tool():
    subprocess.Popen('tool.exe')
Run Code Online (Sandbox Code Playgroud)