2013-05-14 61 views
0

我有一個輸入文件,我想用在python程序中。它是更好地在變量的使用帶來進口:導入vs打開輸入文件

import imp 
inputData = imp.load_source(...) 

或者是更好的閱讀使用文件:

for line in open('inputfile'): 

是否有優勢或劣勢無論哪種方式?

在此先感謝!

回答

2

每個都有其優點和缺點。逐行方法絕對「更安全」,因爲您不是簡單地執行源文件中找到的任何任意代碼。但是,由於您似乎不太關心惡意用戶,因此我認爲這不是您的環境中的問題。逐行方法的明顯缺點是,在編寫它時它更適合你。代碼顯然更容易編碼。

我相信這樣做的「正確」方法是使用內置函數execfile,因爲這種情況基本上是該函數存在的確切原因。這樣,你可以給整個執行自己的命名空間。它的功能與imp.load_source類似,不同之處在於它不創建模塊。你會做這樣的事情:

loaded_variables = {} 
execfile('foo.bar', loaded_variables) 

值得注意的一個更多的時間,如果你不能信任你的用戶,你不應該允許執行任意代碼!即使這是一種痛苦,如果您不能相信該文件不包含惡意代碼,那麼對輸入/配置文件進行逐行解析或使用其他格式可能會更好。

+0

謝謝!我在科學界工作,所以我並不擔心惡意用戶。它的設置讓用戶指定輸入文件。 – user877334

0

如果您希望Python執行文件中的語句,最好導入而不是以字符串的形式讀取文件(這是open(...)會導致的結果)。

而且如果你將要導入的文件,你還不如把它放在你的PYTHONPATH中列出的目錄,並簡單地使用

import config 

在另一方面,如果你不這樣做控制文件的內容並且內容由潛在的惡意用戶提供,那麼首先解析內容而不是盲目地執行它的內容是非常重要的。

這是沒有選擇權衡利弊。如果您關心安全性,那麼您不得導入文件

0

當你import一個文件的代碼是執行。你應該從來沒有允許執行任意代碼。在開啓如此巨大的安全漏洞之前仔細考慮。

有很多文件格式可以輕鬆解析,您可以使用,或者甚至可以創建自己的格式。特別是如果分配只包含文字,而不是任意表達。