>>> Popen('cd ~', shell=True, stdout=PIPE).communicate()
(b'', None)
没有shell=True (在shell中运行命令,在默认为/bin/sh的POSIX上)
>>> 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 作为选项不存在,除非您的命令在支持它的shell 中运行。直接传递给实际的 shell 使 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 默认不会在 shell 中执行命令,所以您或多或少不得不依赖使用 os.chdir(...) 或将命令包装在 /bin/sh -c "cd ..." 或类似的东西中。