如何为 popen 指定工作目录

Posted

技术标签:

【中文标题】如何为 popen 指定工作目录【英文标题】:How can I specify working directory for popen 【发布时间】:2010-12-13 16:45:09 【问题描述】:

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

例如:

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

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

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

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

【问题讨论】:

请记住,subprocess.call 只是 subprocess.Popen 的一个薄包装器,而且这个包装器也处理 Popen 的所有参数,至少据我所知 :) 在简单的情况下,最好坚持 subprocess.call 【参考方案1】:

subprocess.Popentakes a cwd argument设置当前工作目录;您还需要转义反斜杠 ('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__)) 

【讨论】:

如果有的话,将 Shell=True 添加到参数对同时设置 cwd 有什么影响? @T. Stone:对于一个独立的可执行文件,它不应该改变任何东西,除非 exe 依赖于 shell 中的一些环境变量,也许吧。但是,对于shell=False,您不能使用诸如cd 之类的内置shell:即,在Linux 上使用shell 两种方式都可以:subprocess.Popen("cd /tmp; pwd") 至少在 python 3 中,即使在 Windows 机器上,你也不必使用反斜杠,我刚刚做了subprocess.call(["C:/Users/Bob/Some.exe"], cwd="C:/Users/Jane/"),它工作正常 工作目录必须是绝对路径吗? 它也适用于 subprocess.check_output()。谢谢!【参考方案2】:

其他方法就是这样做

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

如果您想依赖相对路径,例如,如果您的工具的位置是 c:\some\directory\tool.exe,则此解决方案有效。 cwd 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')

【讨论】:

请注意,您可以通过首先解决相对路径问题来解决,例如与Path("../../something").resolve()。也就是说,我在编写快速脚本时经常使用chdir,否则我可能会用 bash 编写。 @2e0byo 我必须承认,作为一个主要的 Windows 开发人员,我更喜欢 python 而不是批处理 :) Bash 不适合我。 公平,并表示哀悼;)

以上是关于如何为 popen 指定工作目录的主要内容,如果未能解决你的问题,请参考以下文章

如何为配置脚本指定包含目录

如何为 MS Test 项目设置工作目录

如何为当前工作目录的文件夹创建一个名为的变量?

如何为 Linux 目录中的所有文件运行脚本? [复制]

.htaccess 如何为 public_html cpanel 工作

如何为 mocha 指定测试目录?