Python subprocess.Popen简单代码不允许我执行cd(更改目录)
我正试图使用Python脚本来更改目录,但出现了一个错误 python代码:Python subprocess.Popen简单代码不允许我执行cd(更改目录),python,subprocess,popen,Python,Subprocess,Popen,我正试图使用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=
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
文件“test_sub.py”,第2行,在
p=subprocess.Popen(['cd','~'],stdout=subprocess.PIPE)
文件“/usr/lib/python2.7/subprocess.py”,第710行,在__
错误读取,错误写入)
文件“/usr/lib/python2.7/subprocess.py”,第1327行,在执行子进程中
引发子对象异常
OSError:[Errno 2]没有这样的文件或目录
错误意味着什么,我做错了什么,以及如何更改python子流程中的目录
>>> Popen('cd ~', shell=True, stdout=PIPE).communicate()
(b'', None)
不带shell=True
(在默认为/bin/sh
的POSIX上,在shell中运行命令)
所以问题不是路径~
不存在,而是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…”
或类似内容。cd是shell的内置命令,它更改shell的环境,以设置下一个命令将运行到的当前目录。它不是一个常规节目。因此它不能用Popen作为子进程调用
在python中更改当前目录的正确方法是:
import os
os.chdir(os.path.abspath(os.path.expanduser('~')))
#now the current directory is home of user
您需要将所有路径包含在
path = os.path.dirname('$0')
currentpath = os.path.abspath(path)
os.chdir(path)
尝试使用完整路径?@Ashalynd此错误消息是Python2中的一般错误消息,未指定
cd
不存在。我真的不知道shell=True的含义,但如果我添加错误已消失,但我看不到任何输出,即使我将“cd”更改为简单的“ls”。我需要使用['command1','command2'],因为命令来自变量。当然,我还需要看到在python程序上使用这些命令的结果。谢谢,对不起,我只是个初学者。@Haddexcd
没有任何输出,它只是将您从一个位置移动到另一个位置。如果您希望看到[user@machine~]
您不了解shell的工作原理。另外,cd
是一个shell命令,而不是Linux命令(Linux“command”是位于/bin
下的任何东西,而shell命令是内置在shell中的东西)@Haddex希望我的编辑能帮助您了解什么是cd
,以及如何知道可以使用ls/bin
来执行哪些命令。您可以将cwd
参数传递给子进程,而不是父进程中的os.chdir()
。这个答案不正确cd
可以从python启动shell。问题是它更改了shell本身中的目录,而不是父进程中的目录,因此在调用进程中更改目录时不起作用。@Torxed抱歉,但我看到了一个相当神秘的问题,为什么它不够公平:)我可以有点“圆”在我深入了解我真正想说的内容之前,首先用我的语言:)它“可以”通过给出shell=True
来调用,但它只会改变shell本身的状态。(这篇文章似乎没有提供问题的答案。请编辑您的答案,或者只是将其作为问题的注释发布)。
import os
os.chdir(os.path.abspath(os.path.expanduser('~')))
#now the current directory is home of user
path = os.path.dirname('$0')
currentpath = os.path.abspath(path)
os.chdir(path)