>>> 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 osos.chdir(os.path.abspath(os.path.expanduser('~')))因此,问题不在于路径
~不存在,而是
cd在Python的仿真终端中作为选项不存在。直接传递到实际的外壳即可
cd。但是请注意,
shell=True是有风险的,从来没有,除非你需要..用它
所以使用
os.chdir来代替。
工作方案:
import os, subprocessos.chdir(os.path.abspath('/tmp/'))print(subprocess.Popen(['ls', '-lah'], stdout=subprocess.PIPE).communicate()[0].depre('utf-8'))导致:
[torxed@archie ~]$ pythonPython 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].depre('utf-8'))total 12Kdrwxrwxrwt 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-unixdrwx------ 2 torxed users 60 Jun 11 09:33 gpg-LBLcdddrwxrwxrwt 2 root root 40 Jun 11 09:30 .ICE-unixdrwx------ 2 torxed users 80 Jun 11 09:34 .org.chromium.Chromium.LEqfXB-rw------- 1 torxed users 153 Jun 11 09:34 serverauth.EHWB0LqCv6drwxrwxrwt 2 root root 40 Jun 11 09:30 .Test-unix-r--r--r-- 1 root users 11 Jun 11 09:34 .X0-lockdrwxrwxrwt 2 root root 60 Jun 11 09:34 .X11-unixdrwxrwxrwt 2 root root 40 Jun 11 09:30 .XIM-unix>>>请注意,我在启动shell
~并将其
os.chdir更改为tmp,并实际上得到了我的tmp目录内容。
Shell和命令的说明:
shell命令是内置在shell中的命令,而常规的旧命令是您可以在下找到的命令
/bin,例如:
[torxed@archie ~]$ ls /bin2to3 2to3-2.77z 7za...
我实际上可以执行7z命令:
>>> from subprocess import *>>> Popen(['7z'], stdout=PIPE).communicate()(b'n7-Zip [64] 9.20 Copyright (c) 1999-2010 Igor Pavlov 2010-11-18np7zip Version 9.20 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,8 CPUs)n
例如,虽然
cd是内置的shell命令,但是您不会在下面找到它,
/bin但是在大多数“终端”(使用shell)中仍然可以使用,因为它(如前所述)已内置在您通常看到的shell中。
但是由于Python将 模拟外壳程序
,因此只有一组内置且有效的命令,
cd作为其中一个命令,您可以
os.chdir(...)执行完全相同的功能并影响整个程序。



