微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

subprocess.Popen简单代码不允许我执行cd更改目录

如何解决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 举报,一经查实,本站将立刻删除。