【问题标题】:Passing arguments into os.system将参数传递到 os.system
【发布时间】:2013-01-31 06:56:58
【问题描述】:

我需要通过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")

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

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

【问题讨论】:

标签: python argparse os.system


【解决方案1】:

不要使用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'])

【讨论】:

  • 应该是subprocess.call([..., '-syn' ] ),否则是SyntaxError
  • @Bakuriu:谢谢;粗手指错字。
  • 感谢您的回复。 rtl2gds 需要“rtl=”。它不适用于“rtl”。当我尝试 subprocess 选项时: subprocess.call(['rtl2gds', '-rtl=' + args.fileread, '-rtl_top=' + args.module_name, '-syn']) 我收到以下错误:TypeError:无法连接 'str' 和 'file' 对象
  • @Nanditha:您是否尝试过在中间加空格或不加空格? (所以rtl2gds -rtl filename)。
  • @Nanditha:啊,是的,你得到的是一个打开的文件,而不是文件名。不要使用FileType..
猜你喜欢
  • 1970-01-01
  • 2021-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-03
  • 2016-09-02
  • 2014-07-20
  • 2020-07-28
相关资源
最近更新 更多