我编写了一个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命令,这些命令需要很长时间才能手动运行。
FYI,我在Ubuntu20.04.2.0LTS上使用Pycharm 2021.1中的Python3.8
发布于 2021-07-20 14:37:23
异常中显示的字符串是字符串的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/fileshttps://stackoverflow.com/questions/68428391
复制相似问题