如何解决subprocess.Popen简单代码不允许我执行cd更改目录
>>> Popen('cd ~', shell=True, stdout=PIPE).communicate()
(b'', None)
没有shell=True
(模拟外壳程序)
>>> Popen(['cd', '~'], stdout=PIPE).communicate()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.4/subprocess.py", line 858, in __init__
restore_signals, start_new_session)
File "/usr/lib/python3.4/subprocess.py", line 1456, in _execute_child
raise child_exception_type(errno_num, err_msg)
FileNotFoundError: [Errno 2] No such file or directory: 'cd'
>>>
除非通过以下方式进行更改,否则无法更改目录:
import os
os.chdir(os.path.abspath(os.path.expanduser('~')))
因此,问题不在于路径~
不存在,而是cd
在Python的仿真终端中作为选项不存在。直接传递到实际的外壳即可cd
。但是请注意,shell=True
是有风险的,从来没有,除非你需要..用它
所以使用os.chdir
来代替。
工作方案:
import os, subprocess
os.chdir(os.path.abspath('/tmp/'))
print(subprocess.Popen(['ls', '-lah'], stdout=subprocess.PIPE).communicate()[0].decode('utf-8'))
导致:
[torxed@archie ~]$ python
Python 3.4.1 (default, May 19 2014, 17:23:49)
>>> import os, subprocess
>>> os.chdir(os.path.abspath('/tmp/'))
>>> print(subprocess.Popen(['ls', '-lah'], stdout=subprocess.PIPE).communicate()[0].decode('utf-8'))
total 12K
drwxrwxrwt 9 root root 220 Jun 11 12:08 .
drwxr-xr-x 19 root root 4.0K May 28 08:03 ..
drwxrwxrwt 2 root root 40 Jun 11 09:30 .font-unix
drwx------ 2 torxed users 60 Jun 11 09:33 gpg-LBLcdd
drwxrwxrwt 2 root root 40 Jun 11 09:30 .ICE-unix
drwx------ 2 torxed users 80 Jun 11 09:34 .org.chromium.Chromium.LEqfXB
-rw------- 1 torxed users 153 Jun 11 09:34 serverauth.EHWB0LqCv6
drwxrwxrwt 2 root root 40 Jun 11 09:30 .Test-unix
-r--r--r-- 1 root users 11 Jun 11 09:34 .X0-lock
drwxrwxrwt 2 root root 60 Jun 11 09:34 .X11-unix
drwxrwxrwt 2 root root 40 Jun 11 09:30 .XIM-unix
>>>
请注意,我在启动shell~
并将其os.chdir
更改为tmp,并实际上得到了我的tmp目录内容。
Shell和命令的说明:
shell命令是内置在shell中的命令,而常规的旧命令是您可以在下找到的命令/bin
,例如:
[torxed@archie ~]$ ls /bin
2to3 2to3-2.7
7z 7za
...
我实际上可以执行7z命令:
>>> from subprocess import *
>>> Popen(['7z'], stdout=PIPE).communicate()
(b'\n7-Zip [64] 9.20 copyright (c) 1999-2010 Igor Pavlov 2010-11-18\np7zip Version 9.20 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,8 cpus)\n
例如,虽然cd
是内置的shell命令,但是您不会在下面找到它,/bin
但是在大多数“终端”(使用shell)中仍然可以使用,因为它(如前所述)已内置在您通常看到的shell中。
但是由于Python将
,因此只有一组内置且有效的命令,cd
作为其中一个命令,您可以os.chdir(...)
执行完全相同的功能并影响整个程序。
解决方法
我正在尝试使用Python脚本更改目录,但出现错误。
python代码:
import subprocess
p = subprocess.Popen(['cd','~'],stdout=subprocess.PIPE)
output = p.communicate()
print output
我收到此错误:
File "test_sub.py",line 2,in <module>
p = subprocess.Popen(['cd',stdout=subprocess.PIPE)
File "/usr/lib/python2.7/subprocess.py",line 710,in __init__
errread,errwrite)
File "/usr/lib/python2.7/subprocess.py",line 1327,in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
错误是什么意思,我在做什么错,如何在python子进程中更改目录?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。