将参数传递给os.system函数

8
我需要通过Python执行以下命令。 rtl2gds是一个工具,它读取2个参数:文件路径和模块名称。
rtl2gds -rtl=/home/users/name/file.v -rtl_top=module_name -syn

我通过argparse从用户那里读取文件路径和模块名称,如下所示:

parser = argparse.ArgumentParser(description='Read in a file..')    
parser.add_argument('fileread', type=argparse.FileType('r'), help='Enter the file path')    
parser.add_argument('-e', help='Enter the module name', dest='module_name')    
args = parser.parse_args()    
os.system("rtl2gds -rtl=args.fileread -rtl_top=args.module_name -syn")

但是,读入到args.fileread的文件路径在调用-rtl = args.fileread时并没有进入os.system。相反,args.fileread本身被认为是文件名,工具会报错。
我确信有一种方法可以将命令行参数读入到os.system或其他函数中(可能是subprocess?-但找不出来)。任何帮助都将不胜感激。

2个回答

20

不要使用os.system()subprocess绝对是更好的选择。

但是您的问题在于,您希望Python能够理解您想要将 args.fileread 插入到字符串中。尽管Python非常棒,但它并不能像那样读取您的思维!

请改用字符串格式化:

os.system("rtl2gds -rtl={args.fileread} -rtl_top={args.module_name} -syn".format(args=args)

如果您想将文件名传递给另一个命令,应使用 FileType 类型选项!您需要的是文件名,而不是打开的文件对象:

parser.add_argument('fileread', help='Enter the file path')

但要使用subprocess.call(),而不是os.system()

import subprocess

subprocess.call(['rtl2gds', '-rtl=' + args.fileread, '-rtl_top=' + args.module_name, '-syn'])

如果rtl2gds正确实现了命令行解析,那么=是可选的,您可以使用以下调用,完全避免字符串连接:

如果rtl2gds正確實現了命令行解析,那麼=是可選的,您可以使用以下調用,完全避免字符串連接:

subprocess.call(['rtl2gds', '-rtl', args.fileread, '-rtl_top', args.module_name, '-syn'])

应该是subprocess.call([..., '-syn']),否则就会出现SyntaxError - Bakuriu
1
@Bakuriu:谢谢,手指太粗打错字了。 - Martijn Pieters
@Nanditha:你是用空格还是没有空格尝试过呢?(即 rtl2gds -rtl filename)。 - Martijn Pieters
@Nanditha:啊,是的,你得到了一个打开的文件,而不是文件名。不要使用FileType - Martijn Pieters
@Nanditha:是的,那是旧式的字符串格式化选项。 - Martijn Pieters
显示剩余2条评论

0
尝试将一堆 .m4a 文件转换为 .mp3 文件,这个 Python 脚本对我起作用了:
f = os.listdir()

for file in f:

    if(file.endswith('.py')):
        continue

    lastIndex = file.rfind('.')
    name = file[0:lastIndex]
    
    filename = file.replace(' ','\\ ')
    
    name = name.replace(' ','\\ ')
    
    os.system('ffmpeg -i {0} -c:a libmp3lame -q:a 8 {1}.mp3'.format(str(filename), str(name)))


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接