找回密码
 立即注册
搜索
查看: 3150|回复: 30

[求助] python运行cmd命令 参数带空格改怎么写?

[复制链接]
     
发表于 2024-5-13 12:18 | 显示全部楼层 |阅读模式

试了os.system() os.popen() subprocess.run()都无法处理参数中的空格
明明好好地用引号包起来了 为什么就是无法识别呢?
回复

使用道具 举报

     
发表于 2024-5-13 12:20 | 显示全部楼层
args用列表 shell false
回复

使用道具 举报

     
发表于 2024-5-13 12:26 来自手机 | 显示全部楼层
emmmm.....首先我想问你为啥要在cmd里进python去调ffmpeg,直接调不行吗?

—— 来自 HUAWEI ALN-AL10, Android 12上的 S1Next-鹅版 v2.5.2-play
回复

使用道具 举报

     
发表于 2024-5-13 12:27 | 显示全部楼层
午休了,占个楼
首先确定命令直接跑没问题,然后尝试转义空格,然后如二楼所说我记得这个函数有以集合形式传递命令行参数的版本,用那个,不要直接写在命令本体里,然后shell=false
回复

使用道具 举报

     
发表于 2024-5-13 12:29 | 显示全部楼层
对,ffpmeg是有Python封装版本的,如果不是非要用命令行形式执行,用相应的Python包就行
回复

使用道具 举报

     
 楼主| 发表于 2024-5-13 12:32 | 显示全部楼层
ZinGer_KyoN 发表于 2024-5-13 12:26
emmmm.....首先我想问你为啥要在cmd里进python去调ffmpeg,直接调不行吗?

—— 来自 HUAWEI ALN-AL10, An ...

写了个脚本 输入文件名就能把视频切割成两份
回复

使用道具 举报

     
发表于 2024-5-13 12:34 来自手机 | 显示全部楼层
fuochai 发表于 2024-5-13 12:32
写了个脚本 输入文件名就能把视频切割成两份

我以前有类似需求是写个cmd直接调用ffmpeg,现在有chatgpt了那直接让ai写cmd批处理脚本调用不就行了?
回复

使用道具 举报

     
发表于 2024-5-13 12:43 来自手机 | 显示全部楼层
我这样写是可以的
subprocess.check_output(["ffmpeg","-i","ABBA 48000.wav","ABBA 48000.mp3"],cwd=r"E:\Work\Code\Utility\test_audio")

—— 来自 HUAWEI ALN-AL10, Android 12上的 S1Next-鹅版 v2.5.2-play
回复

使用道具 举报

     
 楼主| 发表于 2024-5-13 12:55 | 显示全部楼层

感谢 换成args列表用subprocess.call()可以了 shell=False不写好像也行
  1. import cv2
  2. import subprocess

  3. print('Plese input file name:')
  4. file_name = input()
  5. print(file_name)
  6. cap = cv2.VideoCapture(file_name)

  7. duration_time = int(cap.get(7)/cap.get(5))

  8. cut_time = int(duration_time/2)

  9. subprocess.call(['ffmpeg', '-ss', '0', '-t', str(cut_time), '-i', file_name, '-vcodec', 'copy', '-acodec', 'copy', 'output_1.mp4'])
  10. subprocess.call(['ffmpeg', '-ss', str(cut_time), '-t', str(cut_time), '-i', file_name, '-vcodec', 'copy', '-acodec', 'copy', 'output_2.mp4'])
复制代码


回复

使用道具 举报

     
 楼主| 发表于 2024-5-13 12:56 | 显示全部楼层
Hydro 发表于 2024-5-13 12:29
对,ffpmeg是有Python封装版本的,如果不是非要用命令行形式执行,用相应的Python包就行 ...

刚知道 但我想python总不会处理不了这个空格吧
回复

使用道具 举报

     
发表于 2024-5-13 13:41 | 显示全部楼层
fuochai 发表于 2024-5-13 12:56
刚知道 但我想python总不会处理不了这个空格吧

这不是python的问题,是python与命令行协作的问题,其实主要是命令行语法本身的问题
你这个像是拿cmd起了个python的交互式shell,然后尝试在交互式shell里再调cmd执行ffmeg
7楼也说了,你这样做为什么不直接cmd调ffmeg
就是打开cmd后,不键入python,直接执行"ffmpeg XXXX",这个结果与你python subprocess调是一样的
如果不想这么干,就想通过python,下载python-ffmpeg包(pip install python-ffmpeg),里面有更对象化更清晰的调用方法
回复

使用道具 举报

     
发表于 2024-5-13 13:44 | 显示全部楼层
建议在wsl中用shell脚本写
回复

使用道具 举报

     
发表于 2024-5-13 13:58 | 显示全部楼层
本帖最后由 某浩 于 2024-5-13 14:53 编辑

我记的windows下带有空格的路径,应该要使用双引号吧,单引号应该不行

放在命令里就是 反斜杠 + 双引号

太久没有用过windows忘记了

PS补充:
你写了个脚本,如果没有很复杂的逻辑处理,直接写shell脚本就行了吧
回复

使用道具 举报

     
发表于 2024-5-13 14:12 | 显示全部楼层
本帖最后由 赤色彗星SEXY 于 2024-5-13 14:18 编辑

1. 首先空格问题和python无关,你用什么语言都一样的,具体原理有兴趣就读subprocess源码
   没兴趣你只要知道列表形式在会在实际系统调用的时候传入多个字符串(不需要转义、不用需要引号)
   不用列表相当于通过shell/cmd执行,linux里类似bash -c "you cmd", 存在空格、引号内引号等看不见的麻烦问题

2. 不要用什么python-ffmpeg,没意义,用外部exe文ffmpeg升级还更方便,性能更好

顺便说下,为什么终端里执行命令需要引号、转义等符号
需要引号、转义的不是你执行的命令需要这些符号
而是你执行命令终端(cmd/bash)需要这些符号来区分到底是空格是作为分割符还是参数真的有个空格
当你不是通过终端(cmd/bash)去执行程序时,程序本身去获取参数是不需要引号和转义符的
回复

使用道具 举报

     
发表于 2024-5-13 14:16 来自手机 | 显示全部楼层
压制用不同语言效率会不一样? 不是程序猿不明白为啥

—— 来自 OnePlus GM1910, Android 12上的 S1Next-鹅版 v3.0.0-alpha
回复

使用道具 举报

     
发表于 2024-5-13 14:19 | 显示全部楼层
风夏 发表于 2024-5-13 13:44
建议在wsl中用shell脚本写

装了windows下git的人可能会注意到有个叫git bash的东西
但那个玩意本质上不只是git,更重要的是它是个bash shell
我有的时候就拿那个执行sh脚本玩
回复

使用道具 举报

发表于 2024-5-13 14:22 | 显示全部楼层
就是引号没写对,win必须用双引号
回复

使用道具 举报

头像被屏蔽
     
发表于 2024-5-13 14:24 来自手机 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
发表于 2024-5-13 14:25 | 显示全部楼层
这种问题gpt应该很懂
回复

使用道具 举报

     
发表于 2024-5-13 14:27 | 显示全部楼层
本帖最后由 カドモン 于 2024-5-13 14:28 编辑

1. 用 subprocess 包

2. args 推荐传入 list ,如果用 str 的话,添加 shell=True 参数

3. 推荐使用 list 传参, shell=False,可以避免注入问题

4. 你说不加 shell=False 也可以,因为这个是默认值
回复

使用道具 举报

     
发表于 2024-5-13 14:30 | 显示全部楼层
赤色彗星SEXY 发表于 2024-5-13 14:12
1. 首先空格问题和python无关,你用什么语言都一样的,具体原理有兴趣就读subprocess源码
   没兴趣你只要知 ...

是的,我们调用 subprocess 时强制要求使用 list
参数尽量用 shlex.quote 过一下
回复

使用道具 举报

     
发表于 2024-5-13 14:38 | 显示全部楼层
本帖最后由 nuIIptr 于 2024-5-13 14:41 编辑

我是这样写的,没遇到问题
  1. cmd_extract_h265 = f"./utils/ffmpeg.exe -i {input_video} -y -c:v copy -bsf hevc_mp4toannexb -f hevc video0.hevc"
  2. subprocess.run(cmd_extract_h265)
复制代码

回复

使用道具 举报

     
发表于 2024-5-13 14:44 | 显示全部楼层
你这个filename可以改成读取命令行参数的,这样还能用的上powershell的文件名补全
回复

使用道具 举报

     
发表于 2024-5-13 14:51 | 显示全部楼层
山药白薯 发表于 2024-5-13 14:16
压制用不同语言效率会不一样? 不是程序猿不明白为啥

—— 来自 OnePlus GM1910, Android 12上的 S1Next- ...

不同语言最终编译或解释出来的执行过程不一样,效率自然有差别
但在这个问题上非常明确,python-ffmpeg肯定没有直接执行ffmpeg快,为什么呢,请看vcr
python-ffmpeg本质上只是把你写的对象化的python代码,转化成了脚本命令字符串,然后popen这个脚本命令字符串,相当于你把整个python解释器起起来就只是为了拼个字符串,最后干活的还是只有ffmpeg XXXX与python无关


好处是编写过程更对象化,然后如果你本身用的是python,比如在写服务器之类的,这个库提供了很好的接入ffmpeg的方式,毕竟多数情况下你不缺那点性能

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

     
发表于 2024-5-13 14:51 | 显示全部楼层
shell = True就行
回复

使用道具 举报

     
发表于 2024-5-13 15:01 来自手机 | 显示全部楼层
引号不对
回复

使用道具 举报

     
发表于 2024-5-13 16:03 | 显示全部楼层
这种事情我都是写shell脚本的
回复

使用道具 举报

     
 楼主| 发表于 2024-5-13 18:31 | 显示全部楼层
日日夜夜 发表于 2024-5-13 14:22
就是引号没写对,win必须用双引号

还真是 怎么会这样?
我还以为python中单双引没啥不同 至少为了区分里外的引号 看很多地方也都这样说的
而且这句命令本身用单引号括文件名在cmd里也可以执行的 所以一只都是先单再双 里单外双 没想过反过来试一下
回复

使用道具 举报

发表于 2024-5-13 19:00 | 显示全部楼层
fuochai 发表于 2024-5-13 18:31
还真是 怎么会这样?
我还以为python中单双引没啥不同 至少为了区分里外的引号 看很多地方也都这 ...

cmd直接写单引号应该是不行的,至少我试着是不行的,单引号对cmd来说就是一个普通字符
你看第一张图里报错信息就是: Error opening input file '2024-05-12
'2024-05-12单独作为一个参数了
回复

使用道具 举报

     
 楼主| 发表于 2024-5-13 19:14 | 显示全部楼层
日日夜夜 发表于 2024-5-13 19:00
cmd直接写单引号应该是不行的,至少我试着是不行的,单引号对cmd来说就是一个普通字符
你看第一张 ...

好吧 是powershell可以用单引号 cmd不行
回复

使用道具 举报

     
发表于 2024-5-13 20:04 来自手机 | 显示全部楼层
fuochai 发表于 2024-5-13 18:31
还真是 怎么会这样?
我还以为python中单双引没啥不同 至少为了区分里外的引号 看很多地方也都这 ...

一般来说,跟你计较单双引号和斜杠的都是shell
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|上海互联网违法和不良信息举报中心|网上有害信息举报专区|962110 反电信诈骗|举报电话 021-62035905|Stage1st ( 沪ICP备13020230号-1|沪公网安备 31010702007642号 )

GMT+8, 2024-6-20 10:19 , Processed in 0.116357 second(s), 5 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表