如何通过 Python 调用 potplayer 的 exe 来播放某个音频?

2021-12-28 15:02:43 +08:00
 amiwrong123

环境:window10.

import subprocess  
import os  
main = "C:\Program Files\DAUM\PotPlayer\PotPlayerMini64.exe"
if os.path.exists(main):  
    rc,out= subprocess.getstatusoutput(main)  
    print (rc)
    print ('*'*10)
    print (out)

通过上面的代码是可以打开 potplayer ,但也就只是打开 空白的 potplayer ,并不会播放某个音频。

然后我这么改:

main = "C:\Program Files\DAUM\PotPlayer\PotPlayerMini64.exe 1.wav"

1.wav 是和这个 python 脚本同目录的一个音频,但是这么运行就不好使了,potplayer 没有被打开。

(之所以要写这个脚本,是因为音频有很多个,放在不同的地方,我需要通过 py ,输入一个字符串来找到特定的音频,再用 potplayer 来播放)

3135 次点击
所在节点    程序员
27 条回复
chengyiqun
2021-12-28 15:09:12 +08:00
可以通过 bat 脚本理解决.
我以前写了一个换壁纸的 python 脚本, 用到了批处理.
python 里:
https://paste.org.cn/kzILLcm6wI

bat 里:
https://paste.org.cn/E1QrRgtbnB

bat 里的 "%1" 就是 python 脚本里 run(['setWallpaper.bat', file_path]) 这句里的 file_path
这个数组可以添加更多参数, 依次加 %2 %3 之类的. %0 就是脚本本身了.

可以参考下.
minami
2021-12-28 15:11:08 +08:00
PotPlayerMini64.exe 1.wav /same
chengyiqun
2021-12-28 15:11:17 +08:00
python 脚本完整版我也贴出来吧
https://paste.org.cn/J4HcMJD5Dn

raw_img_url 已经失效. 暂时懒得弄换壁纸了. 提供个新的地址就行了.

我这个脚本是用 windows 任务计划程序每天中午运行一次的. 现在不用了.
cccer
2021-12-28 15:21:02 +08:00
可以用绝对路径试试,PotPlayerMini64 运行的工作目录不一定和 python 脚本的工作目录一致。
ahhui
2021-12-28 15:32:26 +08:00
main = "C:\Program Files\DAUM\PotPlayer\PotPlayerMini64.exe 1.wav"
这个命令行是不合法的,"是字符串边界,所以等效于你传给系统的命令是:
C:\Program Files\DAUM\PotPlayer\PotPlayerMini64.exe 1.wav
由于空格是进程和参数的分隔符,所以系统会认为你要调用的是 C:\Program 这个程序,给的参数是 Files\DAUM\PotPlayer\PotPlayerMini64.exe 1.wav
你可以开个 cmd ,直接这样输入一下看看就知道了
所以正确的做法是

main = """C:\Program Files\DAUM\PotPlayer\PotPlayerMini64.exe"" 1.wav"

我不确定 Python 下双写""是否代表单个的",如果不是,你需要找到一个正确的写法。反正这样的字符串才是正确的命令行:

"C:\Program Files\DAUM\PotPlayer\PotPlayerMini64.exe" 1.wav
zsedc
2021-12-28 15:41:26 +08:00
用 url scheme ?
```
import webbrowser
webbrowser.open_new('potplayer://路径或 url potplayer://file:///D:/path/to/video.wav')
```
kidonng
2021-12-28 15:50:21 +08:00
@ahhui 把空格转移掉就行吧
kidonng
2021-12-28 15:50:42 +08:00
转移 -> 转义
killva4624
2021-12-28 16:03:37 +08:00
搜了一下还有人基于 subprocess.Popen 写了个 potplayer 的 SDK 哈哈哈
https://github.com/MacHu-GWU/potplayer-project
amiwrong123
2021-12-28 16:18:54 +08:00
@cccer #4
@ahhui #5
在 cmd 终端里,运行"C:\Program Files\DAUM\PotPlayer\PotPlayerMini64.exe" "C:\1.wav",是可以的。会调用 potplayer 然后播放 wav 。

但是我执行 python 代码
import subprocess
import os
main=" \"C:\\Program Files\\DAUM\\PotPlayer\\PotPlayerMini64.exe\" \"C:\\1.wav\" "
if os.path.exists(main):
rc,out= subprocess.getstatusoutput(main)
print (rc)
print ('*'*10)
print (out)

print(main)

缺不好使,我佛了。这是怎么回事。print(main)打印出来就是"C:\Program Files\DAUM\PotPlayer\PotPlayerMini64.exe" "C:\1.wav"
28ms
2021-12-28 16:23:34 +08:00
我不清楚 potplayer 是不是功能里的刚需,如果不是刚需可以替换成 vlc ,后者有全套的 python binding ,可以玩出花来。popen 这种调用连暂停都实现不了。
cccer
2021-12-28 16:30:28 +08:00
没有显示是因为 if os.path.exists(main) 这个判断,你的 main 里面根本不是一个路径,而是命令,至于空格转义可以参考我这个。
```
main = r'"C:\Program Files\DAUM\PotPlayer\PotPlayerMini64.exe" "D:\Downloads\1.mp4"'

# if os.path.exists(main):
rc, out = subprocess.getstatusoutput(main)
print(rc)
print('*' * 10)
print(out)
```
amiwrong123
2021-12-28 16:33:21 +08:00
@chengyiqun #1
所以 python 脚本和 bat 脚本在同一个目录呗。


然后我试了一下 bat 脚本:
@echo off
start "" "C:\Program Files\DAUM\PotPlayer\PotPlayerMini64.exe" "C:\1.wav"
发现是可以用,所以我应该把 "C:\1.wav" 替换为 "%1"呗?


另外,本着不懂就问的原则,为啥 start 要跟个"" 呢,我百度了说是为了打开新窗口,但我试了,加不加都是可以的呢?
ahhui
2021-12-28 16:38:53 +08:00
@kidonng 移掉空格是不行的,因为移掉空格,那么 ProgramFiles 目录名就不存在了,这个目录确实有个空格。
ahhui
2021-12-28 16:42:01 +08:00
@amiwrong123 直接帮你 Google 了下,正确的 python 写法应该是这样的:

import subprocess
subprocess.run(["C:\Program Files\DAUM\PotPlayer\PotPlayerMini64.exe", "C:\1.wav"])
ysc3839
2021-12-28 16:44:12 +08:00
subprocess.run(['C:\\Program Files\\PotPlayer\\PotPlayerMini64.exe', 'test.mkv'])
这样并没有问题。

似乎直到 12 楼才有人意识到是 os.path.exists(main) 导致的问题。
再者,Python 本来就有提供自动帮你处理好命令行参数转义的 subprocess.run() 函数,不知道为什么不用这个,而去用那些更麻烦的函数。
amiwrong123
2021-12-28 16:47:04 +08:00
@cccer #12
啊,我太笨了,原来如此,见笑了😂
hpencilb
2021-12-28 17:02:37 +08:00
sunprocess.run 为了防止命令注入默认 shell=False ,一个字符串会被当作一个命令,你要传多个参数进去尽量用元组或者列表,真要字符串传需要增加 shell=True
ysc3839
2021-12-28 17:09:55 +08:00
@hpencilb Windows 和 Unix 不同,进程参数是一个字符串,Unix 则是字符串数组。在 Unix 下需要 shell=True 是因为需要 shell 来把字符串解析成字符串数组,但是 Windows 下不需要。

subprocess.run('"C:\\Program Files\\PotPlayer\\PotPlayerMini64.exe" test.mkv', shell=False)
这样也是没问题的。
mingl0280
2021-12-28 17:21:53 +08:00
python 程序员连程序与调用参数都分不清了么?你不分开成两个部分当然就视为一个完整的路径,你问 Python 要个叫“PotPlayerMini64.exe 1.wav”的文件凭什么 Python 要告诉你有?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/824889

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX