如何避免EOF错误管道多个文件到python脚本
我有一个脚本,将一个或多个文件作为命令行参数,并生成一堆图。我希望能够使用这个脚本,以便我可以找到所有相关的文件并将它们传送给脚本。因此,我有以下电话:如何避免EOF错误管道多个文件到python脚本
find $PWD/somedir/ -path '*_d0/final/*' -name 'somefile.gz' -print0|sort -z |xargs -0 python smth.py
到目前为止好......问题是,虽然我需要一些来自用户的输入,对于哪些列使用(希望脚本是灵活的),后来什么来命名输出数字。
这就是它破坏的地方,我在第一个input()
调用中得到一个EOFError: EOF when reading a line
。我知道使用管道将不同程序的stdin和stdout彼此绑定,因此在稍后的脚本中调用input()
从stdin读取不起作用。
我该如何浏览?我想过用其他方法从用户那里获得输入,就像运行时提交的配置文件一样,但我不喜欢这个解决方案,因为它为每次运行准备配置文件都有点麻烦。应该有一个更简单的方法来解决这个问题。
对此提出建议?
你可以做到一步?类似下面:
第1步 - 找到数据并将其存储在一个临时文件
find $PWD/somedir/ -path '*_d0/final/*' -name 'somefile.gz' -print0|sort -z >> output.out
第2步 - 使用python脚本做任何你用它的愿望,根据用户输入
python smth.py < output.out
在您的python脚本中,将output.out中的数据保存到temp var中,并根据用户输入进行操作。
所以你建议创建一个文件列表中的文件,然后将其用作python脚本的输入? '''做什么?它会不会阻止python脚本的stdin? – posdef
@posdef是的。将内容写入文件,如果这是一个选项。用
在我的系统,人xargs的提出-o
选项专为:
-o执行 命令之前重新打开标准输入为/ dev/tty的子进程。如果你想让xargs运行一个交互式应用程序,这很有用。
这意味着你只需要使用:
find $PWD/somedir/ -path '*_d0/final/*' -name 'somefile.gz' -print0|sort -z |xargs -0 -o python smth.py
仅供参考this answer给出了一些见解,为什么会出现这个问题。简而言之,默认情况下,xargs
指向标准偏差为/dev/null
,因为它不知道它应该是什么。尽管有一个很好的方法可以解决BSD xargs上的这个问题(通过提供-o
标志),但是GNU findutils seem to think的研究人员认为echo foo bar | xargs sh -c 'emacs "[email protected]" < /dev/tty' emacs
是更好的方法。
在这种情况下,它最终看起来是这样的:
find $PWD/somedir/ -path '*_d0/final/*' -name 'somefile.gz' -print0|sort -z |xargs -0 bash -c '</dev/tty python myscript.py "[email protected]"' ignoreme
它的工作原理,但我不得不尊敬与GNU的findutils的开发者不同意,这是规避了这一问题的非常笨拙的方法最终用户。我仍然希望为这个问题寻找更好的解决方案。
不过,我会提供这个答案作为其他谁可能遇到类似问题的参考,以防万一这实际上证明是最好的解决方案。
如何暂时将管道输出存储到文件中,然后将第二个命令作为第二个命令运行,询问用户输入并从存储的输出读取选择性值? –
@FurhanS。不确定你的意思,你能否详细说明一下? – posdef