在Windows上将Ctrl+C信号发送到Python subprocess子进程

在Python中使用subprocess模块启动ffmpeg下载m3u8文件时,如何通过发送Ctrl+C信号来中断下载,同时保持已下载部分的可播放性。尝试了os.kill()的多种方式,最终通过os.kill(0, signal.CTRL_C_EVENT)实现了目标,但需注意此方法会关闭图形界面,解决方案是捕获并处理KeyboardInterrupt异常。" 112204118,10538122,Python Flask+爬虫实现同花顺股票查询网页,"['Python爬虫', 'Web开发', 'Flask框架', '数据抓取', '股票分析']

一、问题描述

在用Python爬取网络视频时,利用了ffmpeg下载并合并m3u8文件,在CMD上运行结果如下:

C:\Users\fz.000>ffmpeg -i "https://vdn.vzuu.com/Act-ss-m3u8-hd/c5777f43b2ca4e588c3747d9c4ca2838/39068440-68b3-11e8-bb26-0242ac112a1eNone.m3u8?auth_key=1535101557-0-0-fedf56c648bfe0d60ef8e0aa89b6a297&expiration=1535101557&disable_local_cache=0" -c copy "E:/PycharmProjects/Video_Crack/video/video1.mp4"
ffmpeg version N-91646-g78d4b6bd43 Copyright (c) 2000-2018 the FFmpeg developers
  built with gcc 8.2.1 (GCC) 20180813
  configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth
  libavutil      56. 19.100 / 56. 19.100
  libavcodec     58. 23.100 / 58. 23.100
  libavformat    58. 17.103 / 58. 17.103
  libavdevice    58.  4.101 / 58.  4.101
  libavfilter     7. 26.100 /  7. 26.100
  libswscale      5.  2.100 /  5.  2.100
  libswresample   3.  2.100 /  3.  2.100
  libpostproc    55.  2.100 / 55.  2.100
[hls,applehttp @ 00000263fedba840] Opening 'https://vdn.vzuu.com/Act-ss-m3u8-hd/c5777f43b2ca4e588c3747d9c4ca2838/39068440-68b3-11e8-bb26-0242ac112a1eNone-00001.ts?auth_key=1535101557-0-0-e6986ea2f49dd0a3ad5954823a79b3d0' for reading
[hls,applehttp @ 00000263fedba840] Opening 'https://vdn.vzuu.com/Act-ss-m3u8-hd/c5777f43b2ca4e588c3747d9c4ca2838/39068440-68b3-11e8-bb26-0242ac112a1eNone-00002.ts?auth_key=1535101557-0-0-1f6b4fb3db9df8067d972990c71a74cb' for reading
Input #0, hls,applehttp, from 'https://vdn.vzuu.com/Act-ss-m3u8-hd/c5777f43b2ca4e588c3747d9c4ca2838/39068440-68b3-11e8-bb26-0242ac112a1eNone.m3u8?auth_key=1535101557-0-0-fedf56c648bfe0d60ef8e0aa89b6a297&expiration=1535101557&disable_local_cache=0':
  Duration: 00:00:59.12, start: 1.433556, bitrate: N/A
  Program 0
    Metadata:
      variant_bitrate : 0
    Stream #0:0: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p, 1280x2276, 25 fps, 25 tbr, 90k tbn, 50 tbc
    Metadata:
      variant_bitrate : 0
    Stream #0:1: Audio: aac (LC) ([15][0][0][0] / 0x000F), 44100 Hz, stereo, fltp
    Metadata:
      variant_bitrate : 0
Output #0, mp4, to 'E:/PycharmProjects/Video_Crack/video/video1.mp4':
  Metadata:
    encoder         : Lavf58.17.103
    Stream #0:0: Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x2276, q=2-31, 25 fps, 25 tbr, 90k tbn, 90k tbc
    Metadata:
      variant_bitrate : 0
    Stream #0:1: Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp
    Metadata:
      variant_bitrate : 0
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
[https @ 00000263fedc0080] Opening 'https://vdn.vzuu.com/Act-ss-m3u8-hd/c5777f43b2ca4e588c3747d9c4ca2838/39068440-68b3-11e8-bb26-0242ac112a1eNone-00003.ts?auth_key=1535101557-0-0-91103599f3d036c53025d4469811f47f' for reading
[https @ 00000263fee04180] Opening 'https://vdn.vzuu.com/Act-ss-m3u8-hd/c5777f43b2ca4e588c3747d9c4ca2838/39068440-68b3-11e8-bb26-0242ac112a1eNone-00004.ts?auth_key=1535101557-0-0-5425a38189bbdc37cce8e75c99ab8bc0' for reading
[https @ 00000263fedc0080] Opening 'https://vdn.vzuu.com/Act-ss-m3u8-hd/c5777f43b2ca4e588c3747d9c4ca2838/39068440-68b3-11e8-bb26-0242ac112a1eNone-00005.ts?auth_key=1535101557-0-0-9b2cfb83e2058f2904be5b9fc3cd2665' for reading
[https @ 00000263fee04180] Opening 'https://vdn.vzuu.com/Act-ss-m3u8-hd/c5777f43b2ca4e588c3747d9c4ca2838/39068440-68b3-11e8-bb26-0242ac112a1eNone-00006.ts?auth_key=1535101557-0-0-7c76c5b983dec9efe285a19beafe7fa4' for reading
[https @ 00000263fedc0080] Opening 'https://vdn.vzuu.com/Act-ss-m3u8-hd/c5777f43b2ca4e588c3747d9c4ca2838/39068440-68b3-11e8-bb26-0242ac112a1eNone-00007.ts?auth_key=1535101557-0-0-973c55d77a4dc646c11d79aeba2bac4f' for reading
[https @ 00000263fee04180] Opening 'https://vdn.vzuu.com/Act-ss-m3u8-hd/c5777f43b2ca4e588c3747d9c4ca2838/39068440-68b3-11e8-bb26-0242ac112a1eNone-00008.ts?auth_key=1535101557-0-0-76f76084ff3e5bd058aa7e00336b07d4' for reading
[https @ 00000263fedc0080] Opening 'https://vdn.vzuu.com/Act-ss-m3u8-hd/c5777f43b2ca4e588c3747d9c4ca2838/39068440-68b3-11e8-bb26-0242ac112a1eNone-00009.ts?auth_key=1535101557-0-0-82b119c4d5e5e756c4449e5870e18f00' for reading
[https @ 00000263fee04180] Opening 'https://vdn.vzuu.com/Act-ss-m3u8-hd/c5777f43b2ca4e588c3
### 使用Pythonsubprocess模块运行子进程中的.py文件 通过 `subprocess` 模块,可以方便地启动并运行另一个 Python 脚本。以下是一个详细说明和示例代码。 #### 1. 基本用法 要运行另一个 `.py` 文件,可以使用 `subprocess.run()` 函数[^2]。此函数允许传递命令及其参数,并且可以通过设置选项来控制子进程的行为。例如,可以通过指定 `shell=True` 来启用 shell 特性,或通过 `check=True` 确保命令成功执行[^3]。 ```python import subprocess # 定义目标脚本路径 script_path = 'path/to/your/script.py' # 使用subprocess.run()运行脚本 result = subprocess.run(['python', script_path], capture_output=True, text=True) # 输出结果 print("标准输出:", result.stdout) print("标准错误:", result.stderr) ``` #### 2. 获取子进程的输出 如果需要捕获子进程的标准输出和标准错误,可以使用 `capture_output=True` 和 `text=True` 参数。这将使 `stdout` 和 `stderr` 属性返回字符串而不是字节流。 ```python try: output = subprocess.check_output(['python', script_path], stderr=subprocess.STDOUT, text=True) print("脚本输出:", output) except subprocess.CalledProcessError as e: print(f"脚本执行失败,退出码为 {e.returncode}") print("错误信息:", e.output) ``` #### 3. 创建管道 在某些情况下,可能需要将一个命令的输出作为另一个命令的输入。这可以通过创建管道实现。例如,可以将 `ps` 的输出传递给 `grep`[^4]。 ```python ps = subprocess.Popen(('ps', 'aux'), stdout=subprocess.PIPE) grep = subprocess.Popen(('grep', 'python'), stdin=ps.stdout, stdout=subprocess.PIPE) ps.stdout.close() output = grep.communicate()[0] print(output.decode()) ``` #### 4. 并行运行多个子进程 如果需要同时运行多个 `.py` 文件,可以使用多个 `subprocess.Popen()` 实例[^5]。每个实例代表一个独立的子进程。 ```python import subprocess # 定义多个脚本路径 scripts = ['script1.py', 'script2.py', 'script3.py'] # 启动多个子进程 processes = [] for script in scripts: process = subprocess.Popen(['python', script]) processes.append(process) # 等待所有子进程完成 for process in processes: process.wait() ``` ### 注意事项 - **路径问题**:确保提供的脚本路径是正确的,最好使用绝对路径。 - **错误处理**:建议使用 `try-except` 块捕获 `subprocess.CalledProcessError` 异常以处理可能的错误。 - **资源管理**:当使用管道时,务必关闭不再需要的文件描述符(如 `ps.stdout.close()`),以避免资源泄漏[^4]。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值