如何在Python中运行包含引号和subprocess.run的tsduck shell命令

问题描述

这是tsduck手册中写的命令:

tsp -I dvb -a 1 @ts1028.txt \
     -P svremove -s AlJazeeraEnglish \
     -P merge "tsp -I dvb -a 0 @ts1022.txt -P zap TV5MondeEurope" \
     -P analyze -i 30 -o merged.txt \
     -O dektec @modulation.txt

这是我的版本:

import sys
import subprocess

mod_values = { "bandwidth":             "8-mhz","convolutional_rate":    "7/8","frequency":             "578000000","guard_interval":        "1/4","dmb_constellation":     "64-QAM","modulation":            "DVB-T"}

tsterinfo_rate = subprocess.run(['tsterinfo',"-h",mod_values["convolutional_rate"],"-g",mod_values["guard_interval"],"-c",mod_values["dmb_constellation"],"-s"],stdout=subprocess.PIPE,universal_newlines=True)

mod_values["dvb_bitrate"] = tsterinfo_rate.stdout

infile=sys.argv[1]

run_tsp = subprocess.run(['tsp','--verbose','-b',mod_values["dvb_bitrate"],'-I','null','-P','merge',f'"tsp -I File {infile} --infinite"','pcrbitrate','regulate','-O','dektec','--frequency',mod_values["frequency"],'--modulation',mod_values["modulation"],'--guard-interval','--convolutional-rate','--dmb-constellation','-s'])

如果我尝试将其保留为完整字符串,并用双引号引起来的单引号引起来,则命令中带引号的部分将返回此错误

/bin/sh: 1: tsp -I File ../Videos/myts.ts --infinite: not found

完全不带引号的错误是说太多的输入与直接进入终端而不带引号一样。

python 3.8.5,ubuntu 20.04

解决方法

在执行此操作时,我发现我的tsp命令有一些问题。关于将引号传递给子流程的问题的答案似乎可以通过使用

解决。
shell=True
子流程选项中的

。然后,您可以将命令行参数作为一个大字符串而不是列表进行传递。

我最后一个以传输流作为参数并创建可通过Dektec DTU-215进行混泥的CBR输出的最终脚本是:

    import sys
    import subprocess
    import json
    
    # set modulation parameters in dict in order to reference once for bitrate calc and use again for modulator setup
    mod_values = { "bandwidth":             "8-mhz","convolutional_rate":    "7/8","frequency":             "578000000","guard_interval":        "1/4","dmb_constellation":     "64-QAM","modulation":            "DVB-T"}
    
    # calculate modulated bitrate and add to dict
    tsterinfo_rate = subprocess.run(['tsterinfo',"-h",mod_values["convolutional_rate"],"-g",mod_values["guard_interval"],"-c",mod_values["dmb_constellation"],"-s"],stdout=subprocess.PIPE,universal_newlines=True)
    
    mod_values["dvb_bitrate"] = tsterinfo_rate.stdout.strip()
    
    # first argument is input file transport stream
    infile=sys.argv[1]
    
    # use mediainfo to calculate bitrate of input ts (must be CBR)
    infile_mediainfo = subprocess.run(["mediainfo","--Output=JSON",infile],capture_output=True)
    
    print(infile_mediainfo)
    
    media_data = json.loads(infile_mediainfo.stdout)
    
    ts_bitrate = int(media_data["media"]["track"][0]["OverallBitRate"])
    
    print(f'ts_bitrate is: {ts_bitrate}')
    
    # without -t option we don't have a PAT to even merge our stream with
    # packet burst seems to make big difference to how smooth final playback is,default (16 according to docs) was jerky but 14 seems smooth
    run_tsp = subprocess.run(f'tsp \
                    --verbose \
                    -d \
                    -b {mod_values["dvb_bitrate"]} \
                    -I null \
                    -P regulate --packet-burst 14 \
                    -P merge \
                    -t \
                        "tsp -I file {infile} \
                        --infinite \
                        -P regulate -b {ts_bitrate}" \
                    -O dektec \
                    -f {mod_values["frequency"]} \
                    -m {mod_values["modulation"]} \
                    -g {mod_values["guard_interval"]} \
                    -r {mod_values["convolutional_rate"]} \
                    --dmb-constellation {mod_values["dmb_constellation"]} \
                    -s',shell=True)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...