首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Python语言中使用subprocess.run运行包含引号的tsduck shell命令

如何在Python语言中使用subprocess.run运行包含引号的tsduck shell命令
EN

Stack Overflow用户
提问于 2020-10-16 09:06:10
回答 1查看 481关注 0票数 0

以下是tsduck手册中编写的命令:

代码语言:javascript
复制
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

以下是我的版本:

代码语言:javascript
复制
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"',
    '-P', 'pcrbitrate',
    '-P', 'regulate',
    '-O', 'dektec',
    '--frequency', mod_values["frequency"],
    '--modulation', mod_values["modulation"],
    '--guard-interval', mod_values["guard_interval"],
    '--convolutional-rate', mod_values["convolutional_rate"],
    '--dmb-constellation', mod_values["dmb_constellation"],
    '-s'])

如果我尝试将命令中的引号部分保留为完整字符串,并在单引号中包含空格,则命令中的引号部分将返回此错误:

代码语言:javascript
复制
/bin/sh: 1: tsp -I File ../Videos/myts.ts --infinite: not found

在没有引号的情况下,它会错误地说输入太多,就像没有引号直接进入终端一样

python 3.8.5,ubuntu 20.04

EN

回答 1

Stack Overflow用户

发布于 2020-10-19 22:35:52

在完成这项工作时,我发现我的tsp命令有一些错误。关于将引号传递给子流程的问题的答案似乎可以通过使用

代码语言:javascript
复制
shell=True

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

我将传输流作为参数并创建CBR输出以便通过Dektec DTU-215进行处理的最后一个脚本是:

代码语言:javascript
复制
    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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64381606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档