我正在我的本地目录中开发/测试包。我想在解释器(v2.5)中导入它,但sys.path不包含当前目录。现在我输入sys.path.insert(0,'.')
。有没有更好的办法?
另外,
from . import mypackage
因此错误而失败:
ValueError: Attempted relative import in non-package
答案 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 *