如何避免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读取不起作用。

我该如何浏览?我想过用其他方法从用户那里获得输入,就像运行时提交的配置文件一样,但我不喜欢这个解决方案,因为它为每次运行准备配置文件都有点麻烦。应该有一个更简单的方法来解决这个问题。

对此提出建议?

+0

如何暂时将管道输出存储到文件中,然后将第二个命令作为第二个命令运行,询问用户输入并从存储的输出读取选择性值? –

+0

@FurhanS。不确定你的意思,你能否详细说明一下? – posdef

你可以做到一步?类似下面:

第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中,并根据用户输入进行操作。

+0

所以你建议创建一个文件列表中的文件,然后将其用作python脚本的输入? '''做什么?它会不会阻止python脚本的stdin? – posdef

+0

@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 
+0

你有哪个版本的xargs? – posdef

+0

我在我的Mac上有这个选项,但在远程服务器上我没有这个选项。这有点奇怪,因为Ubuntu服务器上的版本是从2016年开始的(GNU findutils 4.7.0) – posdef

仅供参考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的开发者不同意,这是规避了这一问题的非常笨拙的方法最终用户。我仍然希望为这个问题寻找更好的解决方案。

不过,我会提供这个答案作为其他谁可能遇到类似问题的参考,以防万一这实际上证明是最好的解决方案。