我对python非常陌生。我正在尝试在我的python脚本中模拟cat 我正在传递输入(“ Hello world”)的读取输出,并且显示此错误: 我认为这是因为您必须提供文件名作为参数而不是字符串。
如果是这种情况,我该如何在cat命令中使用读取标准输入? (cat 资源非常有限,不能使用os.popen()或os.subprocess()。 谢谢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()
cat: 'Hello world.': No such file or directory
答案 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个文件描述符打开:
命令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')