繁体   English   中英

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

[英]How to make an executable shell script to run my .py program and input a file

我有一个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

PS这实际上是我第一次体验编程(我开始只为这个项目学习python)所以请原谅这些糟糕的代码。

在脚本中添加一个'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')

而在壳...

$ chmod u+x scriptname
$ cat inputfile.txt | ./scriptname
something should be written
$ ./scriptname < inputfile.txt
something should be written

像这样执行脚本:

./shellscript.sh inputfile.txt

在你的shellscript.sh里面:

python scriptname.py $1

确保python脚本和输入文件与shell脚本位于相同的路径中,或者修改脚本以反映python脚本所在的位置/path/to/script/scriptname.py

冷杉,你的代码不是从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()

*好吧,您可以将输入保存到临时文件中,然后将其输入该路径。 但这是作弊。

如果您希望应用程序同时处理 - 即能够传递文件并且能够将stdin作为内部处理的同一文件对象 - 您应该查看StringIO / cStringIO: http ://docs.python.org/2/library /stringio.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM