Don't mess with the search path
你是对的,不要和sys.path
混为一谈.这是不推荐的,而且总是一个丑陋的解决方法.有更好的解决方案.
Restructure your folder layout
见official Python docs about packaging.
区分project folder和package folder.我们假设您的some_root
文件夹是包文件夹,它也是包的名称(用于import
语句).建议将文件包文件夹放入名为src
的文件夹中.上面是项目文件夹some_project
.该项目文件夹布局也称为"Src布局".
你的情况应该是这样的.
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
Make your package installable
用该内容创建一个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()
"Install" the package
这不是通常的安装.请参阅Developement Mode以了解这真正意味着什么.包裹未复制到/usr/lib/python/site-packages
中;仅创建链接.
导航到项目文件夹some_project
并运行
python3 -m pip install --editable .
不要忘记最后的.
分.根据您的操作系统和环境,您可能需要将python3
替换为py -3
或python
或其他内容.
Import
您的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()
但正如其他人在 comments 中所说的那样.改善文件和文件夹的 struct 并降低其复杂性.