Une autre façon de faire est simplement de le faire
cwd = os.getcwd()
os.chdir('c:\some\directory')
subprocess.Popen('tool.exe')
os.chdir(cwd)
Cette solution fonctionne si vous souhaitez vous fier aux chemins relatifs, par exemple, si l'emplacement de votre outil est c:\some\directory\tool.exe
. L'argument clé cwd
pour Popen
ne vous permettra pas de le faire. Certains scripts/outils peuvent avoir besoin que vous soyez dans le répertoire donné lors de leur invocation. Pour rendre ce code moins bruyant, c'est-à-dire séparer la logique liée au changement de répertoires de la "logique métier", vous pouvez utiliser un décorateur.
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
Un tel décorateur peut ensuite être utilisé de la manière suivante:
@invoke_at(r'c:\some\directory')
def start_the_tool():
subprocess.Popen('tool.exe')
3 votes
Gardez à l'esprit que subprocess.call n'est qu'une mince enveloppe de subprocess.Popen, et cette enveloppe gère également tous les arguments de Popen, du moins autant que je m'en souvienne :) Dans les cas simples, il vaut mieux se tenir à subprocess.call
0 votes
Vous devriez maintenant probablement préférer
subprocess.run
, bien quecall
et les enveloppes légèrement plus récentes héritéescheck_call
etcheck_output
soient toujours disponibles.