2013-08-05 60 views
0

我從python.org讀到了文檔,但仍然對這個問題感到困惑。在一個項目中,我有以下腳本結構:我應該怎麼做才能導入math.py,而不是stdlib

DIR一:

math.py containing func c() 
    main.py containing main() 

我應該在main.py爲了下一個目錄,而不是STDLIB導入數學嗎?

進口數學是行不通的

+3

另一種選擇是你的文件重命名爲類似「custom_math.py」或東西,不與模塊共用一個名字在stdlib中。 – SethMMorton

+0

絕對同意@SethMMorton。你可以用「但它只適用於這個項目」這個名稱來證明這個名稱的正確性,但是事情有一種增長的方式,如果你剛剛學習,你想以正確的方式做事,並且包括在stdlib之後不命名模塊。 – MattDMo

回答

2

編輯:

對不起我的錯......這不會有任何效果。您可以選擇爲頂層包提供一個與標準庫中的名稱不衝突的名稱。或者主腳本不能位於軟件包目錄中。所以基本上你可以:

重命名模塊my_math.py然後main.py可以在同一目錄下,你可以這樣做:

from my_math import c 
c() 

或者你打個包,例如文件夾名稱test(或不使用標準庫包衝突的任何其他名稱)與文件:__init__.pymath.py,並在同一水平test創建main.py,然後將代碼如下:

from test.math import c 
c() 

文件夾結構:

. 
|-- test 
| |-- __init__.py 
| `-- math.py 
`-- main.py 
+0

它不起作用,不幸的。 ValueError被拋出。 ValueError:試圖在非包中嘗試相對導入 – user2653947

+0

向同一個目錄添加一個空的'__init __。py'。這將使目錄成爲一個包。雖然給模塊使用相同的名稱並不是一個好習慣,特別是如果它們是頂級模塊,那麼它就是標準庫中的模塊。 –

+0

也試過了,但在這裏拋出相同的錯誤。 Windows系統在這裏是否重要? – user2653947

1

這可以工作。

sys.path.insert(0,'path/to/math.py') 
import math 

這將使python在指定的目錄之前檢查stdlibs。出於同樣的原因,這是一種有風險的方法。我建議將math.py放在其OWN目錄中並使用該路徑,所以沒有其他更改。

如果您還有其他模塊導入,我也會推薦導入這個LAST。

import stuff 
import morestuff 
sys.path.insert(0,'path/to/math') 
import math 

同樣,不推薦使用「數學」。重命名是最好的,特別是對於像「數學」這樣的流行模塊。

0

您可以導入具有模塊文件路徑的精確規格的模塊,並給模塊指定一個特定名稱。 看看imp模塊。

下面是一個例子:

# file: math.py 
def say_hello(): 
    print "Hello!" 

和主文件:

# file: main.py 
import imp 
my_math = imp.load_source("my_math", "math.py") 
my_math.say_hello() 

給出兩個文件躺在那裏當前的工作目錄,這對我的作品。

請注意,這種方法往往是高度不可維護和不靈活的。不要與標準庫和其他語言功能名稱衝突是一件好事。因此,您應該重命名該模塊或將其移動到一個(非全局)名稱空間,即一個子包。

參考:

相關問題