Python 3.x Python3子进程&x27;访问被拒绝';

Python 3.x Python3子进程&x27;访问被拒绝';,python-3.x,subprocess,Python 3.x,Subprocess,当我将原始视频从捕获卡编码到传输流中时,我试图通过带有大量参数的命令行运行VLC: import os import sys import subprocess comm_string = r'"G:\VLC\vlc" --ffmpeg-hw --avcodec-hw=any dshow:// :dshow-vdev="Video (00 Pro Capture HDMI 4K+)" :dshow-adev="Audio ' \ '(2- 00 Pro Capture HDMI 4K+)" :

当我将原始视频从捕获卡编码到传输流中时,我试图通过带有大量参数的命令行运行VLC:

import os
import sys
import subprocess

comm_string = r'"G:\VLC\vlc" --ffmpeg-hw --avcodec-hw=any dshow:// :dshow-vdev="Video (00 Pro Capture HDMI 4K+)" :dshow-adev="Audio ' \
'(2- 00 Pro Capture HDMI 4K+)" :dshow-threads=8 :dshow-aspect-ratio=16\:9 :dshow-size="3840x2160" :dshow-pixel_format=yuv444p16le ' \
':dshow-tune=film :dshow-preset=lossless :dshow-profile=main10 show-vcodec=x265 :dshow-fps=50 :dshow-crf=0 :dshow-acodec=mp4a ' \
':dshow-stereo-mode=5 :dshow-force-surround-sound=0 :dshow-ab=128 :dshow-samplerate=44100 :no-dshow-config :live-caching=300 --sout ' \
'"#transcode{venc=ffmpeg,vcodec=mp2v,threads=8,aspect=16:9,width=3840,height=2160,fps=50,acodec=a52,ab=1500,channels=2,samplerate=48000,soverlay}' \
':standard{access=file,dst=-,mux=ts}"'


startupinfo = None
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW

process = subprocess.Popen([comm_string], startupinfo=startupinfo)
…这将生成以下错误:

Traceback (most recent call last):
  File "G:/HTPC Scripts/NPVR Command Line/Command Line.py", line 17, in <module>
    process = subprocess.Popen([comm_string], startupinfo=startupinfo)
  File "G:\Python36\lib\subprocess.py", line 709, in __init__
    restore_signals, start_new_session)
  File "G:\Python36\lib\subprocess.py", line 997, in _execute_child
    startupinfo)
PermissionError: [WinError 5] Access is denied
回溯(最近一次呼叫最后一次):
文件“G:/HTPC Scripts/NPVR命令行/Command Line.py”,第17行,在
流程=子流程.Popen([comm_string],startupinfo=startupinfo)
文件“G:\Python36\lib\subprocess.py”,第709行,在\uuu init中__
恢复信号,启动新会话)
文件“G:\Python36\lib\subprocess.py”,第997行,在执行子进程中
startupinfo)
PermissionError:[WinError 5]访问被拒绝
…据我所知,您可以使用单个字符串将程序及其所有伴随参数传递到子进程中。不是这样吗?如果没有,我应该如何修改语法


谢谢

首先,为什么在字符串的每一行都加上r?它是单个字符串,所以只使用一次就可以了。还有,你喜欢这道菜吗?如果您不介意,我建议您使用os.popen()或os.system()

这是解决方案,顺便说一句:

import os
import sys
import subprocess

os.chdir('G:\\VLC\\')

startupinfo = None
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW

process = subprocess.Popen([
'vlc',
'--ffmpeg-hw',
'--avcodec-hw=any',
'dshow:// :dshow-vdev="Video (00 Pro Capture HDMI 4K+)" :dshow-adev="Audio (2- 00 Pro Capture HDMI 4K+)"',
':dshow-threads=8',
':dshow-aspect-ratio=16\:9',
':dshow-size="3840x2160"',
':dshow-pixel_format=yuv444p16le',
':dshow-tune=film',
':dshow-preset=lossless',
':dshow-profile=main10',
'show-vcodec=x265',
':dshow-fps=50',
':dshow-crf=0',
':dshow-acodec=mp4a',
':dshow-stereo-mode=5',
':dshow-force-surround-sound=0',
':dshow-ab=128',
':dshow-samplerate=44100',
':no-dshow-config',
':live-caching=300',
'--sout',
'"#transcode{venc=ffmpeg,vcodec=mp2v,threads=8,aspect=16:9,width=3840,height=2160,fps=50,acodec=a52,ab=1500,channels=2,samplerate=48000,soverlay}:standard{access=file,dst=-,mux=ts}"',
], stdout=subprocess.PIPE, startupinfo=startupinfo)

嗨-重复的原始字符串是我的疏忽。我现在已经修正了这个问题,但是我仍然得到同样的结果。为什么要使用操作系统而不是子流程?如果您有OP问题的解决方案,请只发布答案。否则发表评论。@JBentley我会记住这一点,但是,我的声誉很低,所以我不允许对我没有发表的smth发表评论。