gpt4 book ai didi

python - 无法使用python子进程从curl调用获取返回值

转载 作者:太空宇宙 更新时间:2023-11-03 14:04:18 24 4
gpt4 key购买 nike

所以我尝试用 python 编写一个简单的包装器来调用 rasa(一个 nlu 工具)。我在命令行上编写的命令是这样的:

curl -X POST "localhost:5000/parse" -d '{"q":"I am looking for fucking Mexican food"}' | python -m json.tool

我期望的输出是这样的:

% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 545 0 500 100 45 33615 3025 --:--:-- --:--:-- --:--:-- 35714

加上 json 文件的输出。

我用 python 编写了这个程序:

import subprocess

utterance = "Lets say something"


result = subprocess.run(["curl", "-X", "POST", "localhost:5000/parse", "-d", "'{\"q\":\""+utterance+"\"}'", "|", "python", "-m", "json.tool"], stdout=subprocess.PIPE)
print(vars(result))
print(result.stdout.decode('utf-8'))

不幸的是,我的输出是这样的,这意味着我实际上没有从curl调用中获得返回:

{'args': ['curl', '-X', 'POST', 'localhost:5000/parse', '-d', '\'{"q":"Lets say something"}\'', '|', 'python', '-m', 'json.tool'], 'returncode': 2, 'stdout': b'', 'stderr': None}

如果我从命令行调用我的 python 程序,这就是输出:

curl: option -m: expected a proper numerical parameter curl: try 'curl --help' or 'curl --manual' for more information {'args': ['curl', '-X', 'POST', 'localhost:5000/parse', '-d', '\'{"q":"Lets say something"}\'', '|', 'python', '-m', 'json.tool'], 'returncode': 2, 'stdout': b'', 'stderr': None}

我尝试到处寻找,但就是无法启动。非常感谢一些帮助。

最佳答案

更新:我第一次严重误解了这个问题。匆忙阅读了详细信息,所以我很抱歉。您遇到问题是因为您尝试使用 Popen 将两个命令通过管道连接在一起。然而,管道运算符是由 shell 实现的,而不是 python。所以它期望你的命令只是与curl相关的命令。这很复杂,但你有选择。

我认为对于您的特定示例,最简单的是不要尝试将命令链接到 json.tool。其实你没有必要。您已经使用了 python,因此您可以自己漂亮地打印从curl 获得的输出。使用 python 看起来像

import json
import shlex
from subprocess import Popen, PIPE

command = 'curl -XGET http://localhost:9200'

p = Popen(shlex.split(command), stdin=PIPE, stdout=PIPE, stderr=PIPE)
output, err = p.communicate()

if p.returncode != 0:
print(err)

j = json.loads(output.decode("utf-8"))
print(json.dumps(j, indent=4, sort_keys=True))

但是,如果您长期想要的是实际使用管道连接多个进程,那么这取决于具体情况。最简单的方法是将 shell=True 传递给 Popen 并传递确切的命令(而不是参数列表)。这将所有事情委托(delegate)给 shell。我需要警告您,当命令基于用户输入时,这是非常容易被利用的。两者2.x pipes.quote()3.x shlex.quote() 提供了如何转义该命令的建议,因此它应该是安全的。

from subprocess import Popen, PIPE

command = 'curl -XGET http://localhost:9200 | python -m json.tool'

p = Popen(command, stdin=PIPE, stdout=PIPE, stderr=PIPE, shell=True)
output, err = p.communicate()

if p.returncode != 0:
print(err)

print(output.decode("utf-8"))

因此,如果您发现自己需要连接进程,但有一些基于用户输入的内容,则可以使用 multiple processes并自己连接它们。

import shlex
from subprocess import Popen, PIPE

command1 = 'curl -XGET http://localhost:9200'
command2 = 'python -m json.tool'

p1 = Popen(shlex.split(command1), stdout=PIPE)
p2 = Popen(shlex.split(command2), stdin=p1.stdout, stdout=PIPE)
p1.stdout.close()
output, err = p2.communicate()

if p2.returncode != 0:
print(err)

print(output.decode("utf-8"))

This如果您好奇的话,问题还有更多关于该主题的信息。

关于python - 无法使用python子进程从curl调用获取返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49018226/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com