组织Python库以使导入按预期方式运行时出现问题
我很难找出导入机制如何工作的关键点,以及这与组织包的关系 假设我编写了两个或更多不相关的、可重用的库。(我将非正式地使用“library”作为代码和资源的集合,包括测试和可能的数据,而不是正式的Python意义上的“package”)。在名为“my_libraries”的父目录中有两个虚构的库: 我希望完成以下三项,在我看来,所有这些都是正常的做法或期望: 1。子目录中的主库代码 为了保持库组织的整洁,我希望将库的核心代码放在子目录(如“src”)中,而不是放在顶层目录中。(我这里的重点不是讨论“src”是否是一种好的命名方法;我已经读了好几页赞成和反对的文章。有些人似乎更喜欢foo/foo的形式,但我想我也会遇到与我描述的相同的问题。) 2。只需向$PYTHONPATH添加一次 我希望能够在$PYTHONPATH或sys.path中只添加一次“我的库”。如果我在“my_libraries”中添加一个新的库,它会自动被我的脚本发现 3。外观正常的导入语句 我希望能够以正常的方式将这些库导入到其他项目中,而不必提及“src”目录:组织Python库以使导入按预期方式运行时出现问题,python,Python,我很难找出导入机制如何工作的关键点,以及这与组织包的关系 假设我编写了两个或更多不相关的、可重用的库。(我将非正式地使用“library”作为代码和资源的集合,包括测试和可能的数据,而不是正式的Python意义上的“package”)。在名为“my_libraries”的父目录中有两个虚构的库: 我希望完成以下三项,在我看来,所有这些都是正常的做法或期望: 1。子目录中的主库代码 为了保持库组织的整洁,我希望将库的核心代码放在子目录(如“src”)中,而不是放在顶层目录中。(我这里的重点不是讨论
import picasso_graphics.brushes
OR
from picasso_graphics import brushes
怎么做?
尽管读了很多书,做了很多实验,我还是没能找到一个满足这三个标准的解决方案。我得到的结论是创建一个picasso\u graphics/\uuuuuu init\uuuuuuy.py
文件,其中包含以下内容:
base_dir = os.path.dirname(__file__)
src_dir = os.path.join(base_dir, "src")
sys.path.insert(0, src_dir)
这几乎满足了我的要求,但我必须将导入分解为两条语句,以便在第一次导入时执行\uuuu init\uuuuu.py
文件:
import picasso_graphics
import brushes
我在这里对什么是可能的做出了错误的假设吗?有没有一个解决方案能满足这三个标准?肖恩,你想要的很可能就是所谓的a;使用名为的工具帮助编写样板文件。每个项目都应该有一个包含所有项目依赖项的setup.cfg。一旦你有了它,为你的项目创建一个虚拟环境,然后安装每一个。。。(在环境内部) 将项目安装到虚拟环境将导致导入在项目之间按您所需的方式运行 我知道,这在开始时会有一点开销,但这些都是你迟早要掌握的技能。Setup.cfg、virtual environments和pip install-e是一种神奇的模式,它能让其他方法让你疯狂的工作 下面是我使用pyscaffold创建的一个简单示例项目。注意,src下面有一个包,src没有init.py。这是pyscaffold人员做出的一个决定,以帮助缓解导入混乱——您可能应该采纳它
my_libraries/
├── audio-studio
│ ├── AUTHORS.rst
│ ├── CHANGELOG.rst
│ ├── LICENSE.txt
│ ├── README.rst
│ ├── requirements.txt
│ ├── setup.cfg
│ ├── setup.py
│ ├── src
│ │ └── audio_studio
│ │ ├── __init__.py
│ │ └── skeleton.py
│ └── tests
│ ├── conftest.py
│ └── test_skeleton.py
└── picasso-graphics
├── AUTHORS.rst
├── CHANGELOG.rst
├── LICENSE.txt
├── README.rst
├── requirements.txt
├── setup.cfg
├── setup.py
├── src
│ └── picasso_graphics
│ ├── __init__.py
│ └── skeleton.py
└── tests
├── conftest.py
└── test_skeleton.py
肖恩,你想要的很可能就是所谓的;使用名为的工具帮助编写样板文件。每个项目都应该有一个包含所有项目依赖项的setup.cfg。一旦你有了它,为你的项目创建一个虚拟环境,然后安装每一个。。。(在环境内部) 将项目安装到虚拟环境将导致导入在项目之间按您所需的方式运行 我知道,这在开始时会有一点开销,但这些都是你迟早要掌握的技能。Setup.cfg、virtual environments和pip install-e是一种神奇的模式,它能让其他方法让你疯狂的工作 下面是我使用pyscaffold创建的一个简单示例项目。注意,src下面有一个包,src没有init.py。这是pyscaffold人员做出的一个决定,以帮助缓解导入混乱——您可能应该采纳它
my_libraries/
├── audio-studio
│ ├── AUTHORS.rst
│ ├── CHANGELOG.rst
│ ├── LICENSE.txt
│ ├── README.rst
│ ├── requirements.txt
│ ├── setup.cfg
│ ├── setup.py
│ ├── src
│ │ └── audio_studio
│ │ ├── __init__.py
│ │ └── skeleton.py
│ └── tests
│ ├── conftest.py
│ └── test_skeleton.py
└── picasso-graphics
├── AUTHORS.rst
├── CHANGELOG.rst
├── LICENSE.txt
├── README.rst
├── requirements.txt
├── setup.cfg
├── setup.py
├── src
│ └── picasso_graphics
│ ├── __init__.py
│ └── skeleton.py
└── tests
├── conftest.py
└── test_skeleton.py
删除
src
目录并将源代码向上移动一个级别将是满足您需求的简单方法,如果您可以接受与首选项的差异,您可以在所有目录中添加\uuuu init\uuuuuuuuy.py
文件,使其成为模块,这可能会对您有所帮助。删除src
目录并将源代码向上移动一个级别将是满足您需要的简单方法,如果您可以接受与您的首选项的差异,您可以在所有目录中添加\uuuu init\uuuuuuuy.py
文件以使其成为模块,这可能会对您有所帮助。谢谢。我正在阅读这篇文章。顺便说一句,如果你想独立安装,你只需要单独的设置。Pyscaffold有一个名称空间选项,您会发现它创建项目的方式略有不同。install-e部件是使导入工作的关键,它将指向项目的符号链接移动到虚拟环境中的site packages文件夹中。它的行为就像您从pypi安装了一个pip。谢谢。我正在阅读这篇文章。顺便说一句,如果你想独立安装,你只需要单独的设置。Pyscaffold有一个名称空间选项,您会发现它创建项目的方式略有不同。install-e部件是使导入工作的关键,它将指向项目的符号链接移动到虚拟环境中的site packages文件夹中。它的行为就像您从pypi安装了pip一样。
my_libraries/
├── audio-studio
│ ├── AUTHORS.rst
│ ├── CHANGELOG.rst
│ ├── LICENSE.txt
│ ├── README.rst
│ ├── requirements.txt
│ ├── setup.cfg
│ ├── setup.py
│ ├── src
│ │ └── audio_studio
│ │ ├── __init__.py
│ │ └── skeleton.py
│ └── tests
│ ├── conftest.py
│ └── test_skeleton.py
└── picasso-graphics
├── AUTHORS.rst
├── CHANGELOG.rst
├── LICENSE.txt
├── README.rst
├── requirements.txt
├── setup.cfg
├── setup.py
├── src
│ └── picasso_graphics
│ ├── __init__.py
│ └── skeleton.py
└── tests
├── conftest.py
└── test_skeleton.py