Python 在使用bash进程替换时,os.system()与os.popen()的比较:ls:cannotaccess'/dev/fd/63';:没有这样的文件或目录

Python 在使用bash进程替换时,os.system()与os.popen()的比较:ls:cannotaccess'/dev/fd/63';:没有这样的文件或目录,python,Python,我正在尝试编写一个Python程序,它使用os.popen()接受一个文件参数并将其发送到子进程。它适用于普通文件。但是当使用bash进程替换()时,它不起作用 为什么os.system()可以工作,但是os.popen()对于同一个命令失败(在Ubuntu上)?下面是run.py: #/usr/bin/env蟒蛇3 导入操作系统 导入系统 cmd=“ls-l%s”%sys.argv[1] 操作系统(cmd) 管道=os.popen(cmd) 打印(pipe.read(),end=”“) 输出

我正在尝试编写一个Python程序,它使用
os.popen()
接受一个文件参数并将其发送到子进程。它适用于普通文件。但是当使用bash进程替换()时,它不起作用

为什么
os.system()
可以工作,但是
os.popen()
对于同一个命令失败(在Ubuntu上)?下面是
run.py

#/usr/bin/env蟒蛇3
导入操作系统
导入系统
cmd=“ls-l%s”%sys.argv[1]
操作系统(cmd)
管道=os.popen(cmd)
打印(pipe.read(),end=”“)
输出:

#os.system(“ls-l文件”)和os.popen(“ls-l文件”)都工作得很好
$run.py文件
-rw-r--r--1彼得·彼得313080四月15日12:27档案
-rw-r--r--1彼得·彼得313080四月15日12:27档案
#os.system(“ls-l/proc/self/fd/11”)工作得很好,但是os.popen(“ls-l/proc/self/fd/11”)失败了
$run.py'管道:[171197]'
ls:无法访问“/proc/self/fd/11”:没有这样的文件或目录
有人知道为什么
os.popen(“ls-l/proc/self/fd/11”)
会这样失败吗

我创建了一个Perl版本,
Perl run.pl
,与上面的Python
run.pl
版本类似,Perl的
system()
open()
都可以正常工作:

#/usr/bin/perl-w
严格使用;
my$cmd=“ls-l$ARGV[0]”;
系统(cmd);
打开(我的$i,$cmd.“|”);
印刷品;
输出:

$perl-run.pl'管道:[165704]'
lr-x-----1彼得·彼得64年4月15日12:27/proc/self/fd/11->管道:[165704]

os.popen
方法实际上只是
subprocess.popen
的包装器。如果我们查看有关的文档,我们会发现:

如果close_fds为true,则在执行子进程之前,将关闭除0、1和2之外的所有文件描述符。否则,当close_fds为false时,文件描述符遵循其可继承标志,如文件描述符的继承中所述

这意味着当使用像

#!/usr/bin/env python3
import os
import subprocess
import sys

cmd = "ls -l %s" % sys.argv[1]
os.system(cmd)
pipe = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, close_fds=False)
stdout, stderr = pipe.communicate()
print(stdout, end="")