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

pro*_*ave 79 python

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

也,

from . import mypackage
Run Code Online (Sandbox Code Playgroud)

失败并出现此错误:

ValueError: Attempted relative import in non-package
Run Code Online (Sandbox Code Playgroud)

Ale*_*lli 37

您只能在一个模块中使用相对导入,而该模块又作为包的一部分导入 - 您的脚本或交互式解释器不是,因此当然from . import(这意味着"从我导入的同一个包导入")不行.import mypackage将被罚款,一旦你确保父目录的mypackagesys.path(你如何设法让你的当前目录sys.path我不知道-你有在site.py一些奇怪的事情,还是......?)

让你当前的目录重新进入sys.path那里实际上没有比把它放在那里更好的方法;-).


Spo*_*ser 14

请参阅sys.path的文档:

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

报价:

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

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

另外,要导入您的包,只需执行以下操作:

import mypackage
Run Code Online (Sandbox Code Playgroud)

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

  • 好点子。也就是说,如果我们从本地目录运行文件。如果它是其他文件夹,并且需要更改 sys.path - 这意味着 `sys.path.insert(0, new_path)` 而不是 `sys.path.append(new_path)`。 (3认同)
  • 如果工作环境中其他地方存在类似的文件名,它将失败。 (2认同)

Gui*_*eim 11

把事情简单化:

 try:
     from . import mymodule     # "myapp" case
 except:
     import mymodule            # "__main__" case
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这个解决方案,它是最简单的.唯一剩下的问题是为什么在实施进口时"只有一种方法"规则被认为是可选的...严重的是,有大约15种方式来声明和组织包裹,所有这些都有缺点 (6认同)

Pie*_*erz 11

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

export PYTHONPATH=/home/user/my_libs
python myscript.py
Run Code Online (Sandbox Code Playgroud)

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

export PYTHONPATH=.
python myscript.py
Run Code Online (Sandbox Code Playgroud)


Nag*_*yan 9

包里面如果有setup.py,那么最好安装它

pip install -e .
Run Code Online (Sandbox Code Playgroud)


bra*_*ers 5

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


man*_*ter 5

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

>>> import sys
>>> sys.path.insert(0, '')
Run Code Online (Sandbox Code Playgroud)

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