2017-09-25 92 views
-1

我想在一個單獨的文件中定義一堆命令來保持整潔。導入前定義的Python模塊使用函數

def cmd1(): 
    print("calling cmd1") 

import define_cmd2 

cmd2() 

然後define_cmd2.py:

cmd1() 

def cmd2(): 
    print("called cmd2") 

它告訴我cmd1()沒有定義。如何調用導入,以便可以使用/編輯/調用在導入調用之前定義的東西?

+0

你可能會認爲在這裏你的命名約定是非常聰明的,但它實際上只是混淆讀者。考慮用真實的名字和適當的格式重寫這個。 – AK47

+0

請給出你的兩個文件的正確例子。我實際上不明白哪個文件應該導入什麼 – roganjosh

+0

是更好的? – BaleineBleue

回答

0

Python文件(例如define_cmd2.py)應該是/應該是自包含的。一個非常基本的要求是,如果你想使用一個名爲cmd1的函數,它必須在define_cmd2.py中定義,或者在調用該函數之前導入的某個文件中定義。

但是,這聽起來更像是一個XY problem。你究竟在做什麼?

+0

我想在我的代碼中間執行'define_cmd2.py'。我在'define_cmd2.py'中定義了一些函數,爲了整潔,我希望將它們全部放在不同的文件中。 – BaleineBleue

+0

爲什麼define_cmd2 meed cmd1呢?這聽起來像define_cmd1應該是一個單獨的文件,也許導入兩次(一次在你的'主'和一次在define_cmd2。@MadPhysicist答案將是相關的然後 –

0

您應該首先了解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會發生什麼:

  1. def語句將創建一個功能define_cmd1.cmd1
  2. import將嘗試加載define_cmd2
  3. importdefine_cmd2不會做任何事情,因爲sys.modules['define_cmd1']已經存在,這意味着它加載或加載。
  4. define_cmd1.cmd1()將運行。
  5. def語句將創建一個功能define_cmd2.cmd2
  6. 返回裝載define_cmd1
  7. 運行define_cmd2.cmd2
+0

execfile工作爲我後?我聽說它是​​不穩定的,爲什麼會這樣? – BaleineBleue

+1

@ZachMozel。這裏沒有人知道你在做什麼,你真的需要拿出一個更好的例子來說明你正在做什麼 –

+0

你有沒有嘗試過我建議並且失敗了,還是你只是在沒有任何應用的情況下提出問題? –

相關問題