当前位置: 首页 > 面试题库 >

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

安高义
2023-03-14
问题内容

我正在尝试使用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子进程中更改目录?


问题答案:
>>> 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(...)执行完全相同的功能并影响整个程序。



 类似资料:
  • 问题内容: 我试图获取我的Layout 以适合我要移植到Java的程序的外观,在此之前,我已经使用了多个LayoutManager并获得了巨大的成功,但是由于某些原因,我似乎无法获得此布局都在工作。我的目标是有权利(东)侧的包含一个“查找下一个”和自上而下的命令“取消”按钮,然后在下面的任何额外的空间,从而使两个按钮总是在的顶部,但由于某种原因,它会不断忽略更改a宽度的任何尝试(这是我迷失的地方)

  • 问题内容: 是否可以授予用户查看权限,但不能更改或删除。 目前,我所看到的唯一权限是“添加”,“更改”和“删除” …,但是其中没有“读取/查看”功能。 我确实需要这样做,因为有些用户只能查看管理面板,以查看已添加的内容。 问题答案: 在admin.py中 有了这个: 然后通过删除以下行来删除提交按钮:

  • 我已经谷歌寻找解决方案,但我已经尝试了所有的方法,其中任何一个工作。首先,我的项目可以解决任何问题,后来我添加了一些更改,这就发生了。当我删除所有更改时,问题并没有消失。当我试图完成这个项目时,gradle控制台显示: Main.java:106:多个dex文件定义Lbolts/Aggregate Exception;com.android.dx.merge.DexMerger.readSorta

  • 问题内容: 我是cmake的新手,我只用它在我的ubuntu linux上安装opencv。这是我运行的命令: 然后它返回错误: 我当前的目录/ home / jinha / OCV / build / opencv确实包含CMakefiles.txt文件,所以这不是问题。我试图在命令中更改目录,但是它们都引发相同的错误。我看到了有关此问题的其他答案,因此,每次运行命令之前,我都会擦除CMakeF

  • postgres不知道在哪里可以找到服务器配置文件。 必须指定--config-file或-d调用选项或设置PGDATA环境变量。 因此,我尝试设置配置文件: 我得到以下错误: 我搜索了这个错误消息,但找不到解决方案。 有人能对此提供一些见解吗?

  • 在WooCommerce中,当订单处于处理状态时,我希望在“我的帐户”页面上显示一个操作按钮,允许客户通过更改订单状态以完成来确认订单已经到达。 我已经看到允许客户通过电子邮件相关的问题代码改变订单的状态(没有答案),这并没有真正帮助实现我的目标。 客户是否可以通过将订单状态更改为“已完成”来确认订单是否已到达?