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