On Thu, Dec 7, 2023, 2:46 AM Hongyi Zhao via curl-library <
curl-library@lists.haxx.se> wrote:

> Dear libcurl community,
>
> I hope this message finds you in good health. I am reaching out to
> seek your assistance regarding an issue that I have been experiencing
> with one of my Python scripts that involves the use of libcurl.
>
> The script, named **proxy-speed.py**, is employed to measure and
> display the speed of different proxies. It runs through a list of
> proxies, giving the current and average speed for each, one at a time.
> However, the issue arises when I try to terminate the script
> prematurely using Ctrl+C. The KeyboardInterrupt appears to only pause
> the current task, and the script instantaneously proceeds with the
> next proxy on the list, clearly illustrating that it doesn’t exit
> entirely.
>
> Here’s an example illustrating the issue:
>
>
> ```
>   File "/home/werner/Desktop/proxy-speed/proxy-speed.py", line 54, in
> progress
>     def progress(download_t, download_d, upload_t, upload_d):
>
> KeyboardInterrupt
> Average Speed: 3944.97 kB/s
>
>     Proxy:
> SG_ssr_futeapbquf5m.nodelist.club_1356_8ce27b1301fcbcb77cc5abb28cb127a6
>     ^CTraceback (most recent call last):
>       File "/home/werner/Desktop/proxy-speed/proxy-speed.py", line 54,
> in progress
>         def progress(download_t, download_d, upload_t, upload_d):
>
>     KeyboardInterrupt
>     Average Speed: 72.81 kB/s
> ```
> This repeat pattern continues for every Ctrl+C interruption made.
> Hence, my goal is to modify the script so that a single Ctrl+C command
> would result in a comprehensive termination of the script.
>
> Any guidance or suggestions that you could offer regarding this issue
> would be greatly appreciated. If there is any further information
> needed to better understand the issue, please let me know.
>
> The content of **proxy-speed.py** is as follows:
>
> ```
> import subprocess
> import time
> import pycurl
> from io import BytesIO
>
> def fetch_proxies():
>     command = 'echo "show stat" | sudo socat stdio
> /var/run/haproxy.sock 2>/dev/null | awk -F, \'$1=="socks5" &&
> !($2~/^(FRONTEND|BACKEND)$/) {print $2,$74}\''
>     process = subprocess.Popen(command, stdout=subprocess.PIPE, shell=True)
>     output, error = process.communicate()
>
>     result_dict = {}  # Initialize default empty dictionary
>
>     if error is not None:
>         return result_dict  # Return the empty dictionary in case of error
>
>     lines = output.decode('utf-8').split('\n')
>
>     for line in lines:
>         if line != "":
>             key_value = line.split(' ')
>             result_dict[key_value[0]] = key_value[1]
>
>     return result_dict
>
>
> def test_proxy(proxy, url):
>     global last_calc_time, download_start_time
>
>     buffer = BytesIO()
>
>     c = pycurl.Curl()
>     c.setopt(pycurl.URL, url)
>     c.setopt(pycurl.WRITEDATA, buffer)
>     c.setopt(pycurl.PROXY, proxy)
>     c.setopt(pycurl.PROXYTYPE, pycurl.PROXYTYPE_SOCKS5_HOSTNAME)
>     c.setopt(pycurl.NOPROGRESS, False)
>     c.setopt(pycurl.XFERINFOFUNCTION, progress)
>     c.setopt(pycurl.TIMEOUT, 5)
>
>     download_start_time = time.time()
>     last_calc_time = download_start_time
>
>     try:
>         c.perform()
>     except pycurl.error as e:
>         pass
>     except KeyboardInterrupt:
>         print("Script interrupted by user. Exiting.")
>         sys.exit(0)  # immediately exit the script
>
>     average_speed = c.getinfo(pycurl.SPEED_DOWNLOAD) / 1024
>     return average_speed
>
> def progress(download_t, download_d, upload_t, upload_d):
>     global last_calc_time, download_start_time
>     current_time = time.time()
>
>     if current_time - last_calc_time >= 2:
>         elapsed_time = current_time - download_start_time
>         current_speed = download_d / elapsed_time / 1024
>         print(f"Current Speed: {current_speed:.2f} kB/s")
>         last_calc_time = current_time
>
> proxy_data = fetch_proxies()
> url = "http://ipv4.download.thinkbroadband.com/1GB.zip";
>
> for key, value in proxy_data.items():
>     print(f"Proxy: {key}")
>     try:
>         average_speed = test_proxy(value, url)
>         print(f"Average Speed: {average_speed:.2f} kB/s")
>     except KeyboardInterrupt:
>         print("Script interrupted by user. Exiting.")
>         break  # exit the for loop
> ```
>
> Thank you very much for your help in advance.
>
> Best Regards,
> Zhao
>
> P.S: If possible, could you please provide both an explanation and
> snippet of the solution so that I can understand and learn from it for
> future references.
> --
> Assoc. Prof. Hongsheng Zhao <hongyi.z...@gmail.com>
> Theory and Simulation of Materials
> Hebei Vocational University of Technology and Engineering
> No. 473, Quannan West Street, Xindu District, Xingtai, Hebei province
> --
> Unsubscribe: https://lists.haxx.se/mailman/listinfo/curl-library
> Etiquette:   https://curl.se/mail/etiquette.html




Since your exception handler doesn't seem to print it's message, and
another message is printed, I suspect the keyboard interrupt exception is
being handled without being raised to your routine.

I don't ctrl-c out of my python scripts often, and mostly do it on Windows,
so I don't have a more complete explanation.

Good luck with the hunting.

Dave S
/DPS
-- 
Unsubscribe: https://lists.haxx.se/mailman/listinfo/curl-library
Etiquette:   https://curl.se/mail/etiquette.html

Reply via email to