我有一个python程序,它从std输入获取文件作为输入,对数据运行一些计算,并将结果输出到std输出。这是我用于获取输入文件的代码:
import math
import sys
name = sys.argv[-1]
inf = open(name, 'r')
outf = open("test.txt", 'w')
col1, col2, col3 = [], [], []
for row in inf:
a, b, c = row.split('\t')
col1.append(a)
col2.append(b)
col3.append(c)
我需要创建一个shell脚本来执行程序并提供输入文件。理想情况下,shell脚本应该可以使用,以便按如下方式使用:
$ cat inputfile.txt | scriptname
和/或
$ ./scriptname < inputfile
我尝试了几个不同的基本shell脚本,但是没有任何运气让它工作。我将不胜感激任何有关如何制作此脚本和/或如何修改我的python代码以使其工作的建议。谢谢!
如果有帮助,我相信我在mac osx 10.8上使用python 2.7.3
P.S。这实际上是我第一次体验编程(我开始为这个项目学习python)所以请原谅这些糟糕的代码。
答案 0 :(得分:2)
在脚本中添加'shebang',使用chmod使其可执行,并且运行时不会被其他任何东西包装。您的代码从命令行打开文件,这不是标准输入或标准输出,因此必须进行更改。既然你没有写任何东西,我只是做了些什么!
但它应该是这样的:
脚本名:
#!/usr/bin/env python
import math
import sys
col1, col2, col3 = [], [], []
for row in sys.stdin:
a, b, c = row.split('\t')
col1.append(a)
col2.append(b)
col3.append(c)
sys.stdout.write('something should be written\n')
在shell中......
$ chmod u+x scriptname
$ cat inputfile.txt | ./scriptname
something should be written
$ ./scriptname < inputfile.txt
something should be written
答案 1 :(得分:1)
执行如下脚本:
./shellscript.sh inputfile.txt
在shellscript.sh中:
python scriptname.py $1
确保python脚本和输入文件与shell脚本位于同一路径中,或修改脚本以反映python脚本所在的位置/path/to/script/scriptname.py
答案 2 :(得分:0)
首先,你的代码不是从stdin读取的;它从最后一个参数指定的路径上的文件中读取。这意味着shell脚本无法为其提供输入。*
您希望更改代码,以便它始终从stdin读取,或者如果没有给出文件名则从stdin读取,或者如果给定-
作为文件名则从stdin读取。例如:
if len(sys.argv) > 1:
name = sys.argv[-1]
inf = open(name, 'r')
except:
inf = sys.stdin
最重要的是,您的脚本无法运行。在Windows上,您需要使用.py
扩展名对其进行命名。但是在几乎任何其他平台上,你需要chmod +x scriptname
该文件使其可以运行,并在脚本顶部添加一个shebang行告诉计算机使用哪个解释器运行它(因为否则它会猜/bin/sh
或其他无用的东西)。特别是,在任何类似POSIX的现代系统上,包括OS X和Linux,你都可以这样做:
#!/usr/bin/env python
解决了这两个问题后,您现在可以完全按照自己的意愿行事:
$ ./scriptname < inputfile
...这将做同样的事情:
$ ./scriptname inputfile
但是,您可能需要考虑使用fileinput
模块,它会为您神奇地处理大部分内容:
import fileinput
inf = fileinput.input()
*嗯,您可以将输入保存到临时文件中,然后将其输入该路径。但这是作弊。
答案 3 :(得分:0)
如果您希望应用程序同时处理两者 - 即能够传递文件并能够将stdin视为内部完全相同的文件对象 - 您应该查看StringIO / cStringIO: http://docs.python.org/2/library/stringio.html