2013-02-15 44 views
3

我需要通過python執行以下命令。 rtl2gds是一個工具,它讀取在2個參數:路徑到一個文件和一個模塊名稱如下所示將參數傳遞到os.system中

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或其他函數中(可能是子進程? - 但是不知道如何)。任何幫助表示讚賞。

+0

[在Python中調用外部命令]可能的重複(http://stackoverflow.com/questions/89228/calling-an-external-command-in-python) – Wolf 2014-09-24 12:23:45

回答

8

請勿使用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']) 
+0

它應該是'subprocess.call([... ,'-syn'' **] **')',否則它是'SyntaxError'。 – Bakuriu 2013-02-15 10:22:37

+1

@Bakuriu:謝謝;厚手指錯字。 – 2013-02-15 10:23:59

+0

感謝您的回覆。 rtl2gds需要「rtl =」。它不適用於「rtl」。 當我嘗試子進程選項: subprocess.call(['rtl2gds','-rtl ='+ args.fileread,'-rtl_top ='+ args.module_name,'-syn']) 我得到以下錯誤: TypeError:無法連接'str'和'file'對象 – Nanditha 2013-02-15 10:39:44