2009-07-11 97 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