我想在一個單獨的文件中定義一堆命令來保持整潔。導入前定義的Python模塊使用函數
def cmd1():
print("calling cmd1")
import define_cmd2
cmd2()
然後define_cmd2.py:
cmd1()
def cmd2():
print("called cmd2")
它告訴我cmd1()
沒有定義。如何調用導入,以便可以使用/編輯/調用在導入調用之前定義的東西?
我想在一個單獨的文件中定義一堆命令來保持整潔。導入前定義的Python模塊使用函數
def cmd1():
print("calling cmd1")
import define_cmd2
cmd2()
然後define_cmd2.py:
cmd1()
def cmd2():
print("called cmd2")
它告訴我cmd1()
沒有定義。如何調用導入,以便可以使用/編輯/調用在導入調用之前定義的東西?
Python文件(例如define_cmd2.py
)應該是/應該是自包含的。一個非常基本的要求是,如果你想使用一個名爲cmd1
的函數,它必須在define_cmd2.py
中定義,或者在調用該函數之前導入的某個文件中定義。
但是,這聽起來更像是一個XY problem。你究竟在做什麼?
我想在我的代碼中間執行'define_cmd2.py'。我在'define_cmd2.py'中定義了一些函數,爲了整潔,我希望將它們全部放在不同的文件中。 – BaleineBleue
爲什麼define_cmd2 meed cmd1呢?這聽起來像define_cmd1應該是一個單獨的文件,也許導入兩次(一次在你的'主'和一次在define_cmd2。@MadPhysicist答案將是相關的然後 –
您應該首先了解Python導入的工作原理。
第一個當你在模塊上調用import
時,它會被執行。生成的名稱空間(包含所有函數和變量定義)用於創建在名稱空間中引用的模塊對象,以及sys.modules
。下一次導入時,導入只會引用sys.modules
中的現有模塊。
爲避免因循環進口錯誤,模塊對象實際上是第一次創建,運行該代碼之前,讓更多進口就已經看到sys.modules
現有的模塊,而不是嘗試通過重新執行相同的代碼和過度。
在您的具體情況下,如果您要使用define_cmd1
的內容,則需要從define_cmd1
明確導入define_cmd2
。其次,你需要正確引用導入的名稱:
define_cmd1:
def cmd1(): print("calling cmd1") import define_cmd2 define_cmd2.cmd2()
define_cmd2
import define_cmd1 import define_cmd1.cmd1() def cmd2(): print("called cmd2")
加粗的項目是你需要添加的代碼位。
爲了澄清,這裏是當你運行define_cmd
會發生什麼:
def
語句將創建一個功能define_cmd1.cmd1
。import
將嘗試加載define_cmd2
import
在define_cmd2
不會做任何事情,因爲sys.modules['define_cmd1']
已經存在,這意味着它加載或加載。define_cmd1.cmd1()
將運行。def
語句將創建一個功能define_cmd2.cmd2
define_cmd1
define_cmd2.cmd2
execfile工作爲我後?我聽說它是不穩定的,爲什麼會這樣? – BaleineBleue
@ZachMozel。這裏沒有人知道你在做什麼,你真的需要拿出一個更好的例子來說明你正在做什麼 –
你有沒有嘗試過我建議並且失敗了,還是你只是在沒有任何應用的情況下提出問題? –
你可能會認爲在這裏你的命名約定是非常聰明的,但它實際上只是混淆讀者。考慮用真實的名字和適當的格式重寫這個。 – AK47
請給出你的兩個文件的正確例子。我實際上不明白哪個文件應該導入什麼 – roganjosh
是更好的? – BaleineBleue