将python包从本地目录导入解释器

时间:2009-07-11 00:57:52

标签: python

我正在我的本地目录中开发/测试包。我想在解释器(v2.5)中导入它,但sys.path不包含当前目录。现在我输入sys.path.insert(0,'.')。有没有更好的办法?

另外,

from . import mypackage

因此错误而失败:

ValueError: Attempted relative import in non-package

11 个答案:

答案 0 :(得分:37)

您只能在模块中使用相对导入,而该模块又作为包的一部分导入 - 您的脚本或交互式解释器当然不是,因此from . import(这意味着“从同一个导入”我从“)导入的包不起作用。一旦确保import mypackage的父目录位于mypackage(您如何设法从sys.path获取当前目录sys.path就可以了我不知道 - 你在site.py中有什么奇怪的东西,或者......?)

要将当前目录恢复为sys.path,实际上没有比把它放在那里更好的方法了; - )。

答案 1 :(得分:13)

请参阅sys.path的文档:

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

引用:

  

如果脚本目录不可用(例如,如果以交互方式调用解释器或者从标准输入读取脚本),则路径[0]为空字符串,指示Python首先搜索当前目录中的模块。

因此,如果您从包含模块的目录启动python解释器,则无需使用sys.path。

另外,要导入您的包,只需执行:

import mypackage

由于包含该包的目录已经在sys.path中,因此它应该可以正常工作。

答案 2 :(得分:9)

如果要运行未修改的python脚本以便从特定的本地目录导入库,则可以设置PYTHONPATH环境变量 - 例如在bash:

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

如果您只想从当前工作目录导入,请使用.表示法:

export PYTHONPATH=.
python myscript.py

答案 3 :(得分:7)

保持简单:

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

答案 4 :(得分:5)

使其工作的一种简单方法是使用python的-m标志从父目录运行脚本,例如: python -m packagename.scriptname。显然,在这种情况下,您需要一个__init__.py文件来将您的目录转换为一个包。

答案 5 :(得分:2)

使用sys.path应该包括当前目录。

尝试:

import .

或:

from . import sth
然而,这可能不是一个好习惯,所以为什么不使用:

import mypackage

答案 6 :(得分:1)

聚会晚了一点,但这对我有用:

>>> import sys
>>> sys.path.insert(0, '')

显然,如果有一个空字符串,Python知道它应该在当前目录中查找。我在sys.path中没有空字符串,这导致了此错误。

答案 7 :(得分:1)

我使用pathlib将模块目录添加到系统路径中,因为我想避免将模块作为软件包安装,并且@maninthecomputer响应对我不起作用

import sys
from pathlib import Path

cwd = str(Path(__file__).parent)
sys.path.insert(0, cwd)
from my_module import my_function

答案 8 :(得分:0)

如果有 setup.py ,则在软件包内部,则最好安装该软件包

pip install -e .

答案 9 :(得分:0)

说到 python3.. 我想使用安装在我的环境中的库的改进版本。它有一些额外的打印语句来表明正在使用它而不是原始库。

我将 lib 文件夹放在 python 脚本旁边。运行脚本..它与修改后的本地库一起运行。

删除文件夹并再次运行 - 这次它使用已安装的库运行。

因此,解决方案很简单:将 lib 的文件夹(与导入语句中的名称相同)放在项目文件夹中。至少在我看来,这可以解决问题。

这是在标准 Linux Mint 20.04 系统上,激活了 python 3.8 虚拟环境(所以当我在虚拟环境中时,“(py3.8)”出现在我的终端中)

答案 10 :(得分:-1)

如果要从同一目录中的特定程序包/文件中导入所有方法,则正确的导入方法是执行from mypackage import *