1

我有一个 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只是为了这个项目)所以请原谅蹩脚的代码。

4

4 回答 4

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')

而在壳...

$ chmod u+x scriptname
$ cat inputfile.txt | ./scriptname
something should be written
$ ./scriptname < inputfile.txt
something should be written
于 2013-10-23T22:41:55.557 回答
1

像这样执行脚本:

./shellscript.sh inputfile.txt

在你的 shellscript.sh 里面:

python scriptname.py $1

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

于 2013-10-23T22:41:00.320 回答
0

首先,您的代码不是从标准输入读取的;它正在从最后一个参数指定的路径的文件中读取。这意味着 shell 脚本不可能为其提供输入。*

您想更改代码,使其始终从标准输入读取,或者如果没有给出文件名则从标准输入读取,或者如果-作为文件名给出则从标准输入读取。例如:

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()

* 好吧,您可以将输入保存到临时文件中,然后将其提供给该路径。但那是欺骗。

于 2013-10-23T22:55:18.077 回答
0

如果您希望您的应用程序同时处理这两者 - 即能够传递文件并能够在内部将标准输入视为完全相同的文件对象 - 您应该查看 StringIO / cStringIO: http ://docs.python.org/2/library /stringio.html

于 2013-10-24T11:37:40.193 回答