【问题标题】:How to print the result of a subprocess.call to a file in a python script如何将 subprocess.call 的结果打印到 python 脚本中的文件
【发布时间】:2016-01-07 16:32:15
【问题描述】:

我有一个 python 脚本,我在其中调用 JIRA API 并从 JIRA 获取一些内容,我想将其写入文件。

cmd中的这个命令可以正常工作

curl -D- -u username:password -X GET --data @file.json -H "Content-Type: application/json" http:URL >> output.json

但是,当我尝试在 Python 中执行相同操作时,它并没有写入我的文件(直接指向我的“出现问题”)

#Runs curl script to get component
def write():
    name = 'output.json'

try:
    file= open(name, 'w')
    file.write(subprocess.call('curl -D- -u username:password -X GET --data @file.json -H "Content-Type: application/json" http:URL'))
    file.close()

except:
    print('something is wrong')
    sys.exit(0)
write()

我还尝试让它在下面写一个变量的内容。

curler = (subprocess.call('curl -D- -u username:password -X GET --data @file.json -H "Content-Type: application/json" http:URL'))

def write():
    name = 'output.json'

try:
    file = open(name, 'w')
    file.write(curler)
    file.close()

except:
    print('something is wrong')
    sys.exit(0)
write()

我使用的是 Windows 7 和 Python 3

【问题讨论】:

  • 你真的需要做一个shell命令吗,你可以使用pycurlrequests直接在python中调用而不用shell,这样处理返回的数据就容易多了。
  • 您能否向我们展示 Traceback 以便我们查看实际错误?
  • 我将尝试使用“请求”,如果我能做出任何事情,我会在这里发帖。目前我试图弄清楚如何在我的 CURL 命令中完全像我想要的那样传递请求。谢谢!

标签: python windows python-3.x command jira


【解决方案1】:

subprocess.call() 接受参数列表并返回被调用进程的退出状态。我认为您正在尝试将标准输出重定向到文件:

curl = ['curl', '-D-', '-u', 'username:password', '-X', 'GET', '--data',
        '@file.json', '-H', 'Content-Type: application/json', 'http:URL']
with open('output.json', 'w') as file:
    status = subprocess.call(curl, stdout=file)

【讨论】:

  • 我正在更改路线(使用请求),但这似乎是我的问题的正确解决方案,所以我会这样做。谢谢!
  • Windows CreateProcess 采用命令行字符串,而不是 POSIX 样式的参数列表或参数数组。在 Windows 上传递列表的唯一原因是为了跨平台兼容性,并让Popen 根据 VC++ 解析规则引用命令。在这种情况下,该命令已被正确引用,例如:subprocess.list2cmdline(curl) =='curl -D- -u username:password -X GET --data @file.json -H "Content-Type: application/json" http:URL'。所需要的只是传递stdout=file 来重定向其标准输出。
  • 感谢您告诉我,我没有要测试的 Windows 机器。虽然我倾向于支持可移植性,但仍然会在 Windows 机器上使用该列表。
【解决方案2】:

1- 您收到异常的原因是您将参数传递给子进程的方式。你应该给 subprocess 一个参数列表而不是一个字符串。假设您想使用 curl 下载 google.com:

subprocess.call(['curl', 'google.com'])

2- subprocess.call 返回退出代码,而不是输出。要将输出重定向到文件:

subprocess.call(['curl', 'google.com'], stdout=open('myFileName', 'w'))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 2016-03-08
    相关资源
    最近更新 更多