【发布时间】:2015-07-09 13:23:39
【问题描述】:
当我尝试调用以下代码时,遇到以下错误:“通过 STDIN(管道)提供数据时,您必须指定格式。”
subprocess.call(["in2csv", "--format", "xls", a_file, ">", output_file], shell=True)
我不确定为什么会这样,因为我告诉它初始格式是什么。我查看了docs,并不清楚--format 和-f 之间的区别。
更新:我已将其更改为使用 argparse 来简化传递 this recommendation 之后的参数。我也在使用 Popen,就像使用 here 一样,这显然比根据 the docs 使用 shell=true 标志更安全。
parser = argparse.ArgumentParser()
parser.add_argument('in2csv')
parser.add_argument('--format')
parser.add_argument('xls')
parser.add_argument(a_file)
parser.add_argument(">")
parser.add_argument(output_file)
args = parser.parse_args()
print args
subprocess.Popen(args)
【问题讨论】:
-
让
cmd =["in2csv", "--format", "xls", "file.xls", ">", "file.csv"]。然后subprocess.call( ' '.join(cmd), shell=True)应该可以工作。我不确定为什么subprocess.call( 'cmd, shell=True)不起作用。我直接从命令行运行in2csv -和in2csv --并收到相同的错误:in2csv: error: You must specify a format when providing data via STDIN (pipe). -
@dermen 你能推荐如何用 argparse 来做吗?
-
只是一些建议
subprocess.Popen可用于使用 subprocess.PIPE 将输出通过管道传输到文件,例如。subprocess.Popen([cmd],stdout=fd,stderr=subprocess.PIPE,shell=False)并且我个人认为,只要您不将参数传递给命令行,您就不需要 args 解析,您所需要的只是正确的字符串,例如cmd = "in2csv --format xls {0}.format(a_file)"另外请检查 subprocess.Popen 的返回并将调用阻塞到退出前完成命令 -
您发布的代码已损坏,实际上 argparse 不是您回答问题所需要的。要回答您的问题,请传递一个字符串而不是字符串列表(就像我在上面的评论中所做的那样)。至于为什么会抛出错误,我不确定。