7

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 または他の関数に読み込む方法があると確信しています (サブプロセスである可能性がありますが、方法がわかりません)。どんな助けでも大歓迎です。

4

1 に答える 1

17

使用しないでくださいos.system()subprocess間違いなく行く方法です。

args.filereadただし、問題は、Python が文字列に補間したいことを理解することを期待していることです。Python はどんなに素晴らしいものでも、そのようにあなたの心を読むことはできません!

代わりに文字列フォーマットを使用してください:

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

ファイル名を別のコマンドに渡したい場合は、 type オプションを使用しないでください。開いているファイル オブジェクトではなく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'])
于 2013-02-15T10:13:37.513 に答える