将参数传递给os.system

8 投票
2 回答
45675 浏览
提问于 2025-04-17 15:59

我需要通过Python执行一个命令。rtl2gds是一个工具,它需要两个参数:一个是文件的路径,另一个是模块的名称。

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")

但是,当我在调用-os.system时,args.fileread读取的文件路径并没有被正确传入,而是args.fileread本身被当作文件名,这导致工具报错。

我相信有办法将命令行参数传递给os.system或者其他函数(也许是subprocess?但我还没弄明白怎么做)。希望能得到一些帮助。

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)))

21

不要使用 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 正确实现了命令行解析,那么 = 是可选的,你可以直接使用下面的调用,这样就完全避免了字符串拼接:

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

撰写回答