【问题标题】:How can I specify working directory for a subprocess如何为子进程指定工作目录
【发布时间】:2023-02-03 17:08:21
【问题描述】:

Python的subprocess.Popen()有没有办法指定command的运行目录?

例如:

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
  • 你现在应该更喜欢subprocess.run,尽管call和稍新的遗留包装器check_callcheck_output仍然可用。

标签: python subprocess popen


【解决方案1】:

subprocess.Popen takes a cwd argument 设置当前工作目录;您还需要转义反斜杠 ('d:\test\local'),或使用 r'd: estlocal',这样反斜杠就不会被 Python 解释为转义序列。按照您编写的方式, 部分将被翻译成标签.

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

subprocess.Popen(r'c:mytool	ool.exe', cwd=r'd:	estlocal')

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

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

【讨论】:

  • 将 Shell=True 添加到参数中对设置 cwd 有什么影响(如果有的话)?
  • @T。 Stone:对于一个独立的可执行文件,它不应该改变任何东西,除非 exe 可能依赖于 shell 中的某些环境变量。但是,对于shell=False,您不能使用内置的 shell,例如cd:即,在 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:somedirectory')
subprocess.Popen('tool.exe')
os.chdir(cwd)

如果您想依赖相对路径,例如,如果您的工具的位置是 c:somedirectory ool.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:somedirectory')
def start_the_tool():
    subprocess.Popen('tool.exe')

【讨论】:

  • 请注意,您可以先解决相对路径问题,例如与Path("../../something").resolve()。也就是说,我在编写快速脚本时通常使用 chdir,否则我可能会用 bash 编写。
  • @2e0byo 我必须承认,作为主要的 Windows 开发人员,我更喜欢 python 而不是批处理 :) Bash 不是我的选择。
  • 实际上,这是我可以找到使用 Popen 来“设置”工作目录 wenn 的唯一方法(或更好:解决方法)。谢谢。
猜你喜欢
  • 2010-12-13
  • 1970-01-01
  • 2010-12-22
  • 2018-01-25
  • 2022-10-14
  • 2016-04-08
  • 2022-01-12
  • 1970-01-01
相关资源
最近更新 更多