【问题标题】:Python os.dup and side-effects [closed]Python os.dup 和副作用 [关闭]
【发布时间】:2011-10-30 06:01:38
【问题描述】:

在我的 python 脚本的开头我这样做:

if '-' in args:
  fd = os.fdopen(os.dup(0))
  sys.stderr.write(fd.read())
  fd.close()

我认为这不会影响我的程序其余部分的行为,但它似乎,即如果我注释掉这 4 行,我的代码可以工作,但如果它们被执行,那么我的程序会有意想不到的结果(我' m 难以排除故障)。

我是否错误地使用了 os.dup?

谢谢。

【问题讨论】:

  • 您的问题不完整,没有描述您在排除故障时遇到的“意外结果”。
  • 我以前见过这种模式!他试图偷看他的输入是什么,但在他的程序的其余部分可以读入之前没有“用完”。我承认,在我自己的 Unix 青年时代,我自己尝试过一次,然后才意识到 文件描述符实际文件是两个完全不同的东西? :)

标签: python linux system pipe


【解决方案1】:

唉,你没有正确使用os.dup()。显然,您希望在标准输入流中“向前看”以查看将出现的内容并将其打印出来,然后让程序的其余部分启动并看到相同的输入仍在等待标准输入。 (我的猜测是否正确,您这样做是出于调试目的?)

您的方法的问题在于,运行 os.dup() 只是创建了第二个文件 descriptor,而不是第二个 file — 换句话说,它创建了另一个整数您可以参考输入数据的来源,但dup() 不会创建第二个实际数据来源。因此,无论您是来自第一个文件描述符还是第二个文件描述符 read(),您仍然“用尽”了输入流中的所有数据。

【讨论】:

    【解决方案2】:

    我也不确定os.dup() 的正确用法,但对于您的示例,您可以这样做

    if '-' in args:
        sys.stderr.write(sys.stdin.read())
    

    甚至

        print(input())  # for python 2.x it would be print raw_input()
    

    【讨论】:

      猜你喜欢
      • 2014-01-17
      • 2011-09-27
      • 2023-01-20
      • 2021-07-30
      • 2015-11-01
      • 2020-08-23
      • 2020-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多