从本地目录导入Python包到解释器

119 投票
10 回答
324871 浏览
提问于 2025-04-15 12:50

我正在本地目录中开发和测试一个包。我想在解释器(版本2.5)中导入它,但发现sys.path里没有当前目录。现在我需要输入 sys.path.insert(0,'.') 来手动添加。有没有更好的方法呢?

另外,

from . import mypackage

运行时出现了这个错误:

ValueError: Attempted relative import in non-package

10 个回答

21

保持简单:

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

查看关于 sys.path 的文档:

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

引用一下:

如果脚本所在的目录不可用(比如说,当你在交互模式下运行解释器,或者脚本是从标准输入读取的),那么 path[0] 就是一个空字符串,这样 Python 会优先在当前目录中查找模块。

所以,如果你是在包含你模块的目录下启动 Python 解释器,就不需要去修改 sys.path。

另外,要导入你的包,只需这样做:

import mypackage

因为包含这个包的目录已经在 sys.path 里,所以应该可以正常工作。

61

你只能在一个被当作包导入的模块中使用相对导入。换句话说,如果你的脚本或者交互式解释器没有被当作包导入,那就不能使用 from . import 这种方式(这个意思是“从我被导入的同一个包中导入”)。不过,使用 import mypackage 是可以的,只要你确保 mypackage 的父目录在 sys.path 中(我不知道你是怎么让当前目录不在 sys.path 中的——是不是在 site.py 里做了什么奇怪的事情?)

要把当前目录放回 sys.path 中,其实没有比直接把它放进去更好的办法了。

撰写回答