2009-07-11 94 views
57

我發展/在我的本地目錄測試包。我想在解釋器(v2.5)中導入它,但sys.path不包含當前目錄。現在我輸入sys.path.insert(0,'.')。有沒有更好的辦法?導入Python包從本地目錄入解釋

此外,

from . import mypackage 

失敗,此錯誤:

ValueError: Attempted relative import in non-package 
+0

你在哪裏讀了「」是一個Python模塊? – 2009-07-11 01:40:23

+9

@Lott:這是一個相對導入路徑,在這裏描述:http://docs.python.org/reference/simple_stmts.html#the-import-statement – projectshave 2009-07-11 02:41:14

回答

28

您只能在模塊中使用相對導入,而該模塊又作爲包的一部分導入 - 您的腳本或交互式解釋器不是,因此當然是from . import(意思是「從我得到的相同包中導入從「導入」)不起作用。 import mypackage一旦你確保mypackage的父目錄在sys.path(你如何設法從sys.path得到你目前的目錄不知道我不知道 - 你有什麼奇怪的site.py,或... ?)

爲了讓您的當前目錄回到sys.path其實也有比把它;-)有沒有更好的辦法。

2

使用sys.path應該包括當前目錄了。

嘗試:

import . 

或:

from . import sth 

但它可能不是一個好的做法,那麼爲什麼不直接使用:

import mypackage 
+1

的問題是它會從全局加載包python env,它可能會從本地文件夾加載包或文件,但它也可以加載工作環境中的一些其他隨機mypackge。 – 2016-06-07 12:44:27

12

參見SYS文件。路徑:

http://docs.python.org/library/sys.html#sys.path

報價:

If the script directory is not available (e.g. if the interpreter is invoked interactively or if the script is read from standard input), path[0] is the empty string, which directs Python to search modules in the current directory first.

所以,沒有必要與sys.path的猴子,如果你開始從包含您的模塊目錄Python解釋器。

此外,導入你的包,只是做:

import mypackage 

由於包含包的目錄已經在sys.path中,它應該工作的罰款。

+0

如果在工作環境的其他地方存在類似的文件名,它將會失敗。 – 2016-06-07 12:45:21

+0

@ JAR.JAR.beans當前的工作目錄應該是`sys.path`中的第一個,因此應該在工作環境中的任何其他位置找到文件。 – SpoonMeiser 2016-06-07 12:59:04

4

一個簡單的方法,使其工作就是使用Python的-m標誌,例如從父目錄運行腳本python -m packagename.scriptname。很顯然,在這種情況下,您需要一個__init__.py文件來將您的目錄變成一個包。

4

保持簡單:

try: 
    from . import mymodule  # "myapp" case 
except: 
    import mymodule   # "__main__" case 
5

如果你想要所以它導入庫從一個特定的本地目錄中運行未經修改的Python腳本可以設置PYTHONPATH環境變量 - 例如在bash:

export PYTHONPATH=/home/user/my_libs 
python myscript.py 

如果你只是希望它從當前工作目錄中導入使用.符號:

export PYTHONPATH=. 
python myscript.py