从 __init__.py 目录导入本地 python 模块
Importing local python module from directory with __init__.py
我一直在做一个需要编辑和使用开源项目的项目,我们称之为 osproj。我将包含已编辑脚本的文件夹重命名为 osprojmine。
这是一个示例目录结构:
root/
mycode.py
osprojmine/
__init__.py
foo.py
bar.py
在mycode.py中我有导入语句
import osprojmine as osproj
我已经能够在 mycode.py 中使用 osproj.module()
和 osproj.class()
,没有任何问题,而且我这边一切运行顺利。
当我将文件发送给我的同事时出现了问题。
他得到了
ModuleNotFoundError: No module named 'osprojmine'
我正在使用 python 3.8.5。他在 3.9.6 并尝试降级。
他的 python 解释器似乎没有将 osprojmine 识别为 python 包,但在我这边它识别出来了吗?很困惑。我对这个领域比较陌生,所以欢迎任何建议!
导入模块时,python 在 sys.path
中指定的目录中执行查找以查找 module.py
或 module/__init__.py
文件。
默认启动后sys.path
包含:
- 当前目录(
""
)
PYTHONPATH
指定的目录
- Python 内置路径
PYTHONUSERBASE
指定的本地站点包
- 系统站点包(或 virtualenv 站点包)
您无法导入 osprojmine
,因为 root
目录不满足这些条件中的任何一个。
第一次你可以:
- 运行 python 来自
root
目录
- 永久或临时将
root
目录添加到您的 PYTHONPATH
:
env PYTHONPATH=/path/to/root:${PYTHONPATH} python ...
但这是穷人的解决方案,最好是用 setuptools and install it (evently in development mode) either in local site-pakage, named user scheme 或 virtualenv site-package 打包你的项目。
同事(和你)应该运行代码为:
$ cd root
$ python -m mycode
这样绝对导入就解决了
我一直在做一个需要编辑和使用开源项目的项目,我们称之为 osproj。我将包含已编辑脚本的文件夹重命名为 osprojmine。
这是一个示例目录结构:
root/
mycode.py
osprojmine/
__init__.py
foo.py
bar.py
在mycode.py中我有导入语句
import osprojmine as osproj
我已经能够在 mycode.py 中使用 osproj.module()
和 osproj.class()
,没有任何问题,而且我这边一切运行顺利。
当我将文件发送给我的同事时出现了问题。
他得到了
ModuleNotFoundError: No module named 'osprojmine'
我正在使用 python 3.8.5。他在 3.9.6 并尝试降级。
他的 python 解释器似乎没有将 osprojmine 识别为 python 包,但在我这边它识别出来了吗?很困惑。我对这个领域比较陌生,所以欢迎任何建议!
导入模块时,python 在 sys.path
中指定的目录中执行查找以查找 module.py
或 module/__init__.py
文件。
默认启动后sys.path
包含:
- 当前目录(
""
) PYTHONPATH
指定的目录
- Python 内置路径
PYTHONUSERBASE
指定的本地站点包
- 系统站点包(或 virtualenv 站点包)
您无法导入 osprojmine
,因为 root
目录不满足这些条件中的任何一个。
第一次你可以:
- 运行 python 来自
root
目录 - 永久或临时将
root
目录添加到您的PYTHONPATH
:env PYTHONPATH=/path/to/root:${PYTHONPATH} python ...
但这是穷人的解决方案,最好是用 setuptools and install it (evently in development mode) either in local site-pakage, named user scheme 或 virtualenv site-package 打包你的项目。
同事(和你)应该运行代码为:
$ cd root
$ python -m mycode
这样绝对导入就解决了