简体   繁体   中英

Difference between subprocess.call and os.system in python 3

I have written a python 3 script to test an API. The API can only be accessed via a server so I have a bash script to execute wget on that server via ssh and move the result to my local machine for analysis. This script works fine on its own.

Now I want to call this bash script from python a few times, however the ssh commands in the bash script seem to break when I use subprocess.call() . This line should save the API response to a chosen location on my server so that I can copy it to my computer later:

ssh USER@SERVER.com "wget 'https://API.com/?${options}' -O '${file_path}'"                                                                                                    

but instead I get the error bash: -O: command not found and the response is saved to a default file generated by wget :

*Using options: 'filter[id]=1234'
*Sending request to API
bash: -O: command not found
--2021-02-19 12:02:52--  https://API.com/?filter[id]=1234

...

Saving to: ‘index.html?filter[id]=1234’

     0K .......... .......... ........                        100% 9.48M=0.003s

2021-02-19 12:02:52 (9.48 MB/s) - ‘index.html?filter[id]=1234.’ saved [29477/29477]                                                                                                                                                          

So it seems to me that the command being executed via ssh was somehow split into multiple commands?

The weird thing is that when I use os.system() to execute the script (or call it directly from the terminal) it works flawlessly. Here is the python code that calls the bash script:

# Failing subprocess.call line
subprocess.call(["./get_api.sh", save_file_name, f"'filter[id]={id}'"])

# Succeeding os.system line
system(f"./get_api.sh {save_file_name} 'filter[id]={id}'") 

I am wondering if anyone can tell me on what might be going on here?

(I edited the included code quite a bit to remove sensitive information, also this is my first stack overflow question so I hope it contains enough information/context)

The single quotes you used in system aren't part of the query; they are just part of the shell command that protects filter[id]={id} from shell expansion. They should be omitted from the use of subprocess.call , which doesn't use a shell.

subprocess.call(["./get_api.sh", save_file_name, f"filter[id]={id}"])

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM