我從python.org讀到了文檔,但仍然對這個問題感到困惑。在一個項目中,我有以下腳本結構:我應該怎麼做才能導入math.py,而不是stdlib
DIR一:
math.py containing func c()
main.py containing main()
我應該在main.py爲了下一個目錄,而不是STDLIB導入數學嗎?
進口數學是行不通的
我從python.org讀到了文檔,但仍然對這個問題感到困惑。在一個項目中,我有以下腳本結構:我應該怎麼做才能導入math.py,而不是stdlib
DIR一:
math.py containing func c()
main.py containing main()
我應該在main.py爲了下一個目錄,而不是STDLIB導入數學嗎?
進口數學是行不通的
編輯:
對不起我的錯......這不會有任何效果。您可以選擇爲頂層包提供一個與標準庫中的名稱不衝突的名稱。或者主腳本不能位於軟件包目錄中。所以基本上你可以:
重命名模塊my_math.py
然後main.py
可以在同一目錄下,你可以這樣做:
from my_math import c
c()
或者你打個包,例如文件夾名稱test
(或不使用標準庫包衝突的任何其他名稱)與文件:__init__.py
和math.py
,並在同一水平test
創建main.py
,然後將代碼如下:
from test.math import c
c()
文件夾結構:
.
|-- test
| |-- __init__.py
| `-- math.py
`-- main.py
它不起作用,不幸的。 ValueError被拋出。 ValueError:試圖在非包中嘗試相對導入 – user2653947
向同一個目錄添加一個空的'__init __。py'。這將使目錄成爲一個包。雖然給模塊使用相同的名稱並不是一個好習慣,特別是如果它們是頂級模塊,那麼它就是標準庫中的模塊。 –
也試過了,但在這裏拋出相同的錯誤。 Windows系統在這裏是否重要? – user2653947
這可以工作。
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
同樣,不推薦使用「數學」。重命名是最好的,特別是對於像「數學」這樣的流行模塊。
您可以導入具有模塊文件路徑的精確規格的模塊,並給模塊指定一個特定名稱。 看看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()
給出兩個文件躺在那裏當前的工作目錄,這對我的作品。
請注意,這種方法往往是高度不可維護和不靈活的。不要與標準庫和其他語言功能名稱衝突是一件好事。因此,您應該重命名該模塊或將其移動到一個(非全局)名稱空間,即一個子包。
參考:
另一種選擇是你的文件重命名爲類似「custom_math.py」或東西,不與模塊共用一個名字在stdlib中。 – SethMMorton
絕對同意@SethMMorton。你可以用「但它只適用於這個項目」這個名稱來證明這個名稱的正確性,但是事情有一種增長的方式,如果你剛剛學習,你想以正確的方式做事,並且包括在stdlib之後不命名模塊。 – MattDMo