如何制作可执行的shell脚本来运行我的.py程序并输入文件

时间:2013-10-23 22:32:32

标签: python bash shell terminal stdin

我有一个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)所以请原谅这些糟糕的代码。

4 个答案:

答案 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