subprocess改变目录

我想在一个子目录/超目录中执行一个脚本(我需要先在这个子目录/超级目录中)。 我不能让subprocess进入我的子目录:

 tducin@localhost:~/Projekty/tests/ve$ python Python 2.7.4 (default, Sep 26 2013, 03:20:26) [GCC 4.7.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import subprocess >>> import os >>> os.getcwd() '/home/tducin/Projekty/tests/ve' >>> subprocess.call(['cd ..']) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python2.7/subprocess.py", line 524, in call return Popen(*popenargs, **kwargs).wait() File "/usr/lib/python2.7/subprocess.py", line 711, in __init__ errread, errwrite) File "/usr/lib/python2.7/subprocess.py", line 1308, in _execute_child raise child_exception OSError: [Errno 2] No such file or directory 

Python抛出OSError,我不知道为什么。 无论我尝试进入现有的子目录还是上一个目录(如上所述),我都会遇到同样的错误。

你的代码试图做的是调用一个名为cd ..的程序。 你想要的是调用一个名为cd的命令。

但是cd是一个内部的shell。 所以你只能称之为

 subprocess.call('cd ..', shell=True) # pointless code! See text below. 

但这样做毫无意义。 由于任何进程都不能改变另一个进程的工作目录(至less在类UNIX的操作系统上,而在Windows上),这个调用将会使子shell改变其目录并立即退出。

你可以用os.chdir()或者subprocess os.chdir()命名参数cwd来实现你想要的结果,这个参数在执行一个子os.chdir()之前立即改变工作目录。

你想要使用绝对path来执行可执行文件,并使用Popen的cwd kwarg来设置工作目录。 看文档 。

如果cwd不是None,那么在执行之前,孩子的当前目录将被更改为cwd。 请注意,search可执行文件时不考虑此目录,因此您无法指定相对于cwd的程序path。

要将your_command作为其他目录中的subprocess运行,请传递cwd参数,如@ wim的答案中所示 :

 import subprocess subprocess.check_call(['your_command', 'arg 1', 'arg 2'], cwd=working_dir) 

subprocess不能更改其父进程的工作目录( 通常 )。 在使用subprocess的子shell进程中运行cd ..将不会更改您的父Python脚本的工作目录,即@ glglgl的答案中的代码示例是错误的 。 cd是一个内置的shell(不是一个单独的可执行文件),它只能在相同的进程中改变目录。

基于这个答案的另一个选项: https : //stackoverflow.com/a/29269316/451710

这允许您在同一个进程中执行多个命令(例如cd )。

 import subprocess commands = ''' pwd cd some-directory pwd cd another-directory pwd ''' process = subprocess.Popen('/bin/bash', stdin=subprocess.PIPE, stdout=subprocess.PIPE) out, err = process.communicate(commands.encode('utf-8')) print(out.decode('utf-8')) 

subprocess.callsubprocess模块中的其他方法都有一个cwd参数。

此参数确定要执行进程的工作目录。

所以你可以做这样的事情:

 subprocess.call('ls', shell=True, cwd='path/to/wanted/dir/') 

查看docs subprocess.popen-constructor