我需要运行一个Python脚本,该脚本只接受作为命令行参数传递的文件输入,例如:
$ markdown.py input_file
有没有办法让它接受标准输入而不是文件输入?我想通过Bash实现这一点,而不需要显著修改Python脚本:
$ echo "Some text here" | markdown.py
如果我需要修改Python脚本,我该怎么做?
(编辑:这里是解析命令行选项的脚本。)
我不确定它的可移植性有多高,但在类Unix系统上,您可以将/dev/stdin
作为您的文件名:
$ echo -n hi there | wc /dev/stdin
0 2 8 /dev/stdin
请确保此内容位于文件顶部附近:
import sys
filename = sys.argv[1]
f = open(filename)
并将其替换为这个:
f = sys.stdin
如果没有看到你要开始处理的脚本,很难提供更具体的信息。
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”不再是文件名,而是文件对象,这意味着调用函数中需要进行进一步修改。
第一种解决方案需要进行较少的修改,但更具平台特定性;第二种解决方案需要更多的工作,但应该可以在更多的系统上运行。
markdown/__init__.py
的第443行,您需要替换...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)
然后你需要调整markdown/commandline.py
,以便在没有给定文件名时不退出:修改72-73行
parser.print_help()
return None, None
到
input_file = None
我建议去这里:
http://codaset.com/repo/python-markdown/tickets/new
可以提交一张工单请求他们添加这个功能。对于他们来说应该很简单,所以他们可能愿意继续做下去。