python-如何使用fork execl将读取的``标准输入''与被称为``猫''命令(bash)一起使用?

时间:2018-10-13 18:43:06

标签: python python-3.x python-2.7

我对python非常陌生。我正在尝试在我的python脚本中模拟cat

import os, sys, time

f = open('file.txt' , "r")  # just hello world written in it. 

default_stdin = os.dup(sys.stdin.fileno())

os.dup2(f.fileno(), sys.stdin.fileno())

i = input()

print(i)  # so i is = 'hello world'

pid = os.fork()

if pid == 0:

    os.execl('/bin/cat','cat', i )

    os.exit()

elif pid > 0:

    os.wait()

os.dup2(default_stdin, sys.stdin.fileno())

f.close()

我正在传递输入(“ Hello world”)的读取输出,并且显示此错误:

cat: 'Hello world.': No such file or directory

我认为这是因为您必须提供文件名作为参数而不是字符串。 如果是这种情况,我该如何在cat命令中使用读取标准输入? (cat

资源非常有限,不能使用os.popen()或os.subprocess()。

谢谢

2 个答案:

答案 0 :(得分:0)

您对i做的所有事情都是错误的。在第一个dup2之后,您已经设置了输入重定向。 cat将从file.txt读取为stdin并将其内容写入stdout。您不需要自己读取文件的内容或传递任何命令行参数。

此外,由于os.exit函数不会返回,因此os.exec*是不可访问的和不必要的。

删除os.exit和与i相关的所有操作都应产生正确的程序:

import os, sys, time

f = open('file.txt', "r")
default_stdin = os.dup(sys.stdin.fileno())
os.dup2(f.fileno(), sys.stdin.fileno())

pid = os.fork()

if pid == 0:
    os.execl('/bin/cat','cat')
elif pid > 0:
    os.wait()

os.dup2(default_stdin, sys.stdin.fileno())
f.close()

顺便说一句,假装您是这样的shell,对于OS类之类的人来说可能是一种很好的学习体验,但是对于一般编程而言,这不是一个好主意。如果要生成非Python工作进程,通常使用subprocess.run。如果要打印文件的内容,则可以在Python中完成,而无需涉及子进程。

答案 1 :(得分:0)

我不太了解为什么要使用fork,因为如果目标是复制cat < file.txt的行为,则不需要任何使用。

这可能是因为对重定向实际上是如何工作的一些误解。当您开始一个进程时-在cat-它有3个文件描述符打开:

  • 0:标准输入
  • 1:标准输出
  • 2:标准错误输出

命令cat仅读取标准输入并在控制台中打印(尝试在终端中使用不带参数的cat,仅通过按^ D会停止,从而关闭标准输入)。当您在终端中使用重定向时,您只说文件描述符0现在指向您的文件。

因此,使用python将重定向重新生成为cat的有效代码就是

import os

fd = os.open("file.txt", os.O_RDONLY)
os.dup2(fd, 0)
os.execl('/bin/cat','cat')