我编写了一个 python 脚本来运行多个 curl 命令(我只列出了一个作为示例),这些命令从创建的 URL 中获取一些内容。但是,如示例所示,URL 有一个反斜杠,在执行时被解释为双反斜杠。 所以这是我想运行的一个命令(注意“fff”后面的反斜杠),如果我将它复制并粘贴到 Linux Ubuntu 终端中,它运行良好:
curl https://api.example.com/fff\|2021-06-25--15-11-33/files -H 'Authorization: JWT eykjgjgjgkjgg'
这是我的代码:
import subprocess
import shlex
curl= "curl https://api.example.com/fff\|2021-06-25--15-11-33/files -H 'Authorization: JWT eykjgjgjgkjgg'"
curlx=shlex.split(curl, posix=False)
print(curlx[1])
#the result of the printed URL is a valid url (with single backslash).
print(curlx)
#the result of the printed full command shows the invalid url (with double backslash)
result= subprocess.run(curlx, stdout=subprocess.PIPE)
result.stdout.decode('utf-8')
print(result)
但我不断收到此错误,因为如结果所示,该命令使用双反斜杠(在“fff”之后)而不是一个反斜杠运行:
#result of first print (curlx[1]):
https://api.example.com/fff\|2021-06-25--15-11-33/files
#result of second print (curlx):
curl https://api.example.com/fff\\|2021-06-25--15-11-33/files -H 'Authorization: JWT eykjgjgjgkjgg'
#result of third print (result):
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 232 100 232 0 0 163 0 0:00:01 0:00:01 --:--:-- 163
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0CompletedProcess(args=['curl', 'https://api.example.com/fff\\|2021-06-25--15-11-33/files', '-H', "'Authorization: JWT eykjgjgjgkjgg'"], returncode=0, stdout=b'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">\n<title>404 Not Found</title>\n<h1>Not Found</h1>\n<p>The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.</p>\n')
我尝试用一个反斜杠替换两个反斜杠,但仍然被解释为两个反斜杠,因此错误不断显示。感谢您的帮助,因为我有 500 多个 curl 命令,手动运行需要很长时间。
仅供参考,我在 Ubuntu 20.04.2.0 LTS 上的 Pycharm 2021.1 中使用 Python 3.8
答案 0 :(得分:1)
异常中显示的字符串是字符串的repr()
,而不是实际的字符串。字符串的 repr
值总是用转义的反斜杠显示。
如果您尝试 print(row.iloc[0])
,您应该会看到它按预期包含一个反斜杠。
有关详细信息,请参阅此答案:https://stackoverflow.com/a/44667847/6825584
但这不是你的问题。
在这里,问题在于您没有正确拆分 subprocess.Popen
的第一个参数。它期望第一个参数是一个数组,在你的情况下应该包含:
['curl',
'https://api.example.com/fff\|2021-06-25--15-11-33/files',
'-H',
"'Authorization: JWT eykjgjgjgkjgg'",
'>>',
'fff|2021-06-25--15-11-33.txt']
您可以使用 shlex.split(row.iloc[0], posix=False)
实现此结果。请注意,此处的 posix=False
将保持您的反斜杠完好无损。
同样,在解释器中运行此命令时,您将看到它打印了两个反斜杠,但使用 print()
时,它按预期正确显示了一个反斜杠。
In [19]: curl = "curl https://api.example.com/fff\|2021-06-25--15-11-33/files -H 'Authorization: JWT eykjgjgjgkjgg' >> fff|2021-06-25--15-11-33.txt"
In [20]: shlex.split(curl, posix=False)
Out[20]:
['curl',
'https://api.example.com/fff\\|2021-06-25--15-11-33/files',
'-H',
"'Authorization: JWT eykjgjgjgkjgg'",
'>>',
'fff|2021-06-25--15-11-33.txt']
In [21]: shlex.split(curl, posix=False)[1]
Out[21]: 'https://api.example.com/fff\\|2021-06-25--15-11-33/files'
In [22]: print(shlex.split(curl, posix=False)[1])
https://api.example.com/fff\|2021-06-25--15-11-33/files