我需要运行的python脚本仅从作为命令行参数传递的文件中获取输入,如下所示:
$ markdown.py input_file
有没有办法让它接受来自STDIN的输入?我希望能够通过Bash完成此操作,而无需显着修改python脚本:
$ echo "Some text here" | markdown.py
如果我必须修改Python脚本,我该怎么做呢?
(编辑:Here是解析命令行选项的脚本。)
答案 0 :(得分:11)
我不确定它有多便携,但在Unix-y系统上,您可以将/dev/stdin
命名为您的文件:
$ echo -n hi there | wc /dev/stdin
0 2 8 /dev/stdin
答案 1 :(得分:4)
确保它位于文件顶部附近:
import sys
然后寻找这样的东西:
filename = sys.argv[1]
f = open(filename)
并将其替换为:
f = sys.stdin
如果没有看到你开始使用的脚本,那么很难更具体。
答案 2 :(得分:0)
在代码中你有这样的一行:
if not len(args) == 1:
你可以做的是检查你是否没有文件名,而是使用“/ dev / stdin”(在允许它的系统上)。
另一个解决方案就是替换:
if not len(args) == 1:
parser.print_help()
return None, None
else:
input_file = args[0]
与
if not len(args) == 1:
input_file = sys.stdin
else:
input_file = open(args[0])
这当然意味着返回的“input_file”不再是文件名而是文件对象,这意味着调用函数的进一步修改。
第一种解决方案是更少的修改,但更多的平台特定,其次是更多的工作,但应该在更多的系统上工作。
答案 3 :(得分:0)
我猜你问题的细节是关于Python-Markdown的,所以我在你的源代码中找到了相关的一行:在{{1的第443行'中做Daniel的方式你需要替换
markdown/__init__.py
与
input_file = codecs.open(input, mode="r", encoding=encoding)
虽然之后你无法实际处理文件,所以对于一个更普遍有用的黑客,你可以放入一个条件:
input_file = codecs.EncodedFile(sys.stdin, encoding)
然后你必须调整if input:
input_file = codecs.open(input, mode="r", encoding=encoding)
else:
input_file = codecs.EncodedFile(sys.stdin, encoding)
如果没有给出文件名就不要退出:更改第72-73行
markdown/commandline.py
到
parser.print_help()
return None, None
关键是,这不是一件简单的事情。在这一点上,我打算建议使用像Mark Rushakoff这样的特殊文件,如果他没有打败我的话; - )
答案 4 :(得分:0)
我建议去这里:
http://codaset.com/repo/python-markdown/tickets/new
并提交一张票,要求他们添加该功能。它应该是直截了当的,所以他们可能愿意继续这样做。
答案 5 :(得分:0)
在bash中,您还可以使用process substitution:
markdown.py <(echo "Some text here")
对于单个输入/ dev / stdin有效,但进程替换也适用于多个输入(甚至输出)