将参数传递给os.system

Nan*_*tha 4 python os.system argparse

我需要通过python执行以下命令.rtl2gds是一个读入2个参数的工具:文件路径和模块名称

rtl2gds -rtl=/home/users/name/file.v -rtl_top=module_name -syn
Run Code Online (Sandbox Code Playgroud)

我正在通过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")
Run Code Online (Sandbox Code Playgroud)

但是当我调用-rtl = args.fileread时,读入args.fileread的文件路径不会进入os.system.相反,args.fileread本身被假定为文件名,工具标记错误.

我确信有一种方法可以将命令行参数读入os.system或其他一些函数(可能是子进程? - 但无法弄清楚如何).任何帮助表示赞赏.

Mar*_*ers 11

不要用os.system(); subprocess绝对是要走的路.

但是你的问题是你希望Python理解你想插入args.fileread一个字符串.就像Python一样伟大,它无法像那样读懂你的想法!

改为使用字符串格式:

os.system("rtl2gds -rtl={args.fileread} -rtl_top={args.module_name} -syn".format(args=args)
Run Code Online (Sandbox Code Playgroud)

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

parser.add_argument('fileread', help='Enter the file path')
Run Code Online (Sandbox Code Playgroud)

但请使用subprocess.call()而不是os.system():

import subprocess

subprocess.call(['rtl2gds', '-rtl=' + args.fileread, '-rtl_top=' + args.module_name, '-syn'])
Run Code Online (Sandbox Code Playgroud)

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

subprocess.call(['rtl2gds', '-rtl', args.fileread, '-rtl_top', args.module_name, '-syn'])
Run Code Online (Sandbox Code Playgroud)