有没有办法在 Python 中指定命令的运行目录subprocess.Popen()
?
例如:
Popen('c:\mytool\tool.exe', workingdir='d:\test\local')
我的 Python 脚本位于C:\programs\python
是否可以C:\mytool\tool.exe
在目录中运行D:\test\local
?
如何设置子进程的工作目录?
有没有办法在 Python 中指定命令的运行目录subprocess.Popen()
?
例如:
Popen('c:\mytool\tool.exe', workingdir='d:\test\local')
我的 Python 脚本位于C:\programs\python
是否可以C:\mytool\tool.exe
在目录中运行D:\test\local
?
如何设置子进程的工作目录?
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__))
另一种方法是简单地做到这一点
cwd = os.getcwd()
os.chdir('c:\some\directory')
subprocess.Popen('tool.exe')
os.chdir(cwd)
如果您想依赖相对路径,例如,如果您的工具的位置是c:\some\directory\tool.exe
. cwd
for 的关键字参数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')