我想在子目录/超级目录中执行一个脚本(我需要先在这个子/超级目录中)。我无法让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
是一个内部壳。所以你只能称之为
subprocess.call('cd ..', shell=True) # pointless code! See text below.
但这样做毫无意义。由于没有进程可以更改另一个进程的工作目录(同样,至少在类UNIX操作系统上,但在Windows上),此调用将使子shell更改其目录并立即退出。
您可以使用os.chdir()
或subprocess
命名参数cwd
来实现您想要的功能,该参数在执行子进程之前立即更改工作目录。
例如,要在根目录中执行ls
,您可以这样做
wd = os.getcwd()
os.chdir("/")
subprocess.Popen("ls")
os.chdir(wd)
或者干脆
subprocess.Popen("ls", cwd="/")
要将your_command
作为不同目录中的子进程运行,请将cwd
参数传递给suggested in @wim's answer:
import subprocess
subprocess.check_call(['your_command', 'arg 1', 'arg 2'], cwd=working_dir)
子进程无法更改其父进程的工作目录(normally)。使用子进程在子shell进程中运行cd ..
不会更改父Python脚本的工作目录,即the code example in @glglgl's answer is wrong。 cd
是一个shell内置的(不是一个单独的可执行文件),它只能在同一进程中更改目录。
您想使用可执行文件的绝对路径,并使用cwd
kwarg of Popen
来设置工作目录。见docs。
如果cwd不是None,则子节点的当前目录在执行之前将更改为cwd。请注意,在搜索可执行文件时不考虑此目录,因此您无法指定程序相对于cwd的路径。
subprocess.call
和subprocess
模块中的其他方法都有cwd
参数。
此参数确定要在其中执行进程的工作目录。
所以你可以这样做:
subprocess.call('ls', shell=True, cwd='path/to/wanted/dir/')
基于这个答案的另一种选择: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'))