Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python subprocess.Popen简单代码不允许我执行cd(更改目录)_Python_Subprocess_Popen - Fatal编程技术网

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

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=

我正试图使用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
文件“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程序上使用这些命令的结果。谢谢,对不起,我只是个初学者。@Haddex
cd
没有任何输出,它只是将您从一个位置移动到另一个位置。如果您希望看到
[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)