不要随意修改搜索路径
你很明智,不要随意操作 sys.path
。这不是推荐的做法,总是一个丑陋的权宜之计。有更好的解决方案。
重新组织你的文件夹结构
参见 Python官方文档中关于打包的部分。
区分项目文件夹和包文件夹。我们假设你的some_root
文件夹是包文件夹,并且也是包的名称(在import
语句中使用)。建议将包文件夹放入名为src
的文件夹中。在它上面是项目文件夹some_project
。这种项目文件夹结构也被称为“Src-Layout”。
在你的情况下,应该像这样:
some_project
└── src
└── some_root
├── dir_0
│ ├── dir_1
│ │ ├── file_1.py
│ │ └── __init__.py
│ ├── dir_2
│ │ ├── file_2.py
│ │ └── __init__.py
│ └── __init__.py
└── __init__.py
使您的软件包可安装
创建一个名为some_project/setup.cfg
的文件,并将以下内容添加到其中。保留第5和6行的换行和缩进,它们必须是这样的,但我不知道为什么。
[metadata]
name = some_project
[options]
package_dir=
=src
packages = find:
zip_safe = False
python_requires = >= 3
[options.packages.find]
where = src
exclude =
tests*
.gitignore
创建
some_project/setup.py
文件,其内容如下:
from setuptools import setup
setup()
安装
这不是一个常规的安装过程。请查看开发模式以理解其实际含义。该软件包并未复制到/usr/lib/python/site-packages
目录中,只有链接被创建。
进入项目文件夹some_project
并运行:
python3 -m pip install --editable .
在结尾不要忘记加上.
。根据你的操作系统和环境,可能需要将python3
替换为py -3
或python
或其他内容。
导入
您的file_2.py
import some_root
import some_root.dir_0
import some_root.dir_0.dir_1
from some_root.dir_0.dir_1 import file_1
file_1.foo()
但正如其他人在评论中所说的那样,改进您的文件和文件夹结构,减少其复杂性。
pip
的--editable
选项。你必须在 开发模式 下 "安装" 你的包。这将让你了解如何重新组织你的项目和包文件夹的布局:https://dev59.com/I3cPtIcB2Jgan1znOsTg#73106602 但你也必须考虑这样的导入结构是否有意义。 - buhtzfile_2.py
?“简单”的答案是,dir_0
不在 Python 搜索路径上的任何目录中。请记住,在启动时,当前工作目录不会被添加到搜索路径中,只有包含脚本的目录会被添加。 - chepner/usr/bin
这样的位置,而任何包都会被安装在/usr/lib/python/site-packages
这样的位置。只有在尝试从源代码执行而没有进行安装时,才会出现此类导入问题。 - chepner