【问题标题】:How can I call in2csv from a Python script?如何从 Python 脚本调用 in2csv?
【发布时间】: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 不是您回答问题所需要的。要回答您的问题,请传递一个字符串而不是字符串列表(就像我在上面的评论中所做的那样)。至于为什么会抛出错误,我不确定。

标签: python csv argparse


【解决方案1】:

您所看到的错误是 shell 被传入的字符串混淆的症状,例如因为文件名中的空格。从 Python 生成进程时,确实最好避免使用 shell。

不要添加 ">" 和 output_file 作为参数,而是尝试使用 stdout 关键字参数重定向输出,该参数采用将写入输出的文件。

假设:

  • a_file 是带有输入文件名称的字符串,并且
  • output_file 是一个带有所需输出文件名称的字符串,

工作调用可能如下所示:

with open(output_file, 'wb') as of:
  subprocess.check_call(["in2csv", "--format", "xls", a_file],
                         stdout=of)

这里不需要使用 argparse;它用于处理进入程序的命令行,而不是退出程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多