从具有反斜杠的多个 URL 卷曲

时间:2021-07-18 10:58:35

标签: python-3.x curl

我编写了一个 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

1 个答案:

答案 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