2013-04-23 93 views
1

我看了一個similar問題,但它並沒有真正回答我的問題。說我有以下代碼(過分簡化,只突出顯示我的問題)。Python:不執行腳本的導入模塊

class A: 
    def __init__(self,x): 
     self.val = x 

a = A(4) 
print a.val 

此代碼位於文件someones_class.py中。我現在想在我的程序中導入和使用類A,而無需修改someones_class.py。如果我做from someones_class import A,python仍然會執行文件中的腳本行。

問:有沒有辦法只是導入類A沒有最後兩行執行?

我知道if __name__ == '__main__'的事情,但我沒有修改someones_class.py文件的選項,因爲它只有在我的程序開始執行後才能獲得。

+1

如果你想導入的模塊有類似於它的那些不是'if __name__ =='__main __':套件的一部分的行,那麼它就壞了,你不應該鼓勵作者嘗試解決它。而是將其標記爲要修復的錯誤。 – martineau 2013-04-23 19:14:18

回答

5

這個答案只是爲了證明可以完成,但顯然需要一個更好的解決方案來確保你包含你想包含的類。

>>> code = ast.parse(open("someones_class.py").read()) 
>>> code.body.pop(1) 
<_ast.Assign object at 0x108c82450> 
>>> code.body.pop(1) 
<_ast.Print object at 0x108c82590> 
>>> eval(compile(code, '', 'exec')) 
>>> test = A(4) 
>>> test 
<__main__.A instance at 0x108c7df80> 

你可以檢查code身體要包括並刪除其餘的元素。

注意:這是一個巨大的黑客攻擊。

+0

+1。 :D – 2013-04-23 20:04:04

+0

感謝您的破解!有可能解釋上面的代碼嗎?流行語句做什麼?和eval? – Nik 2013-04-23 21:35:55

1

不,不能阻止這些額外的行被執行。你可以做的最好的事情是閱讀腳本並解析出課程 - 用它來創建你想要的課程。

這可能比您想做的更多的工作,但是,對於意志堅強的人來說,ast模塊可能會有所幫助。

+0

當'來自模塊導入類'不工作時,我實際上有點失望。我希望,既然我指定了我想要導入的內容,Python解釋器會明白它不需要處理模塊中的其他東西。 – Nik 2013-04-23 19:18:53

+1

@Nik - 這有一個很好的理由。 'class'可以使用模塊級定義的其他常量,函數,類。如果python拒絕導入這些內容,那麼您導入的課程可能無法在「巨人黑客」評論中使用 – mgilson 2013-04-23 19:19:58

1

不,沒有辦法。至少不是沒有極端的欺騙......也就是說,如果你願意破解一些奇怪的「解決方案」,幾乎所有的東西都可能在Python中。

「someones_class.py」從哪裏來?你爲什麼不能改變它?我的意思是,編輯文件,而不是從你的代碼中改變它。你能告訴寫它的人不要寫排序 - 高級測試代碼嗎?

有一個關於Python隱藏在這裏的有趣(有點重要)的教訓:「class A:」不是一個聲明。它實際上是Python解釋器在加載文件時執行的代碼。

相關問題