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.call和subprocess模块中的其他方法都有一个cwd参数。 
此参数确定要执行进程的工作目录。
所以你可以做这样的事情:
 subprocess.call('ls', shell=True, cwd='path/to/wanted/dir/') 
查看docs subprocess.popen-constructor