Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
组织Python库以使导入按预期方式运行时出现问题_Python - Fatal编程技术网

组织Python库以使导入按预期方式运行时出现问题

组织Python库以使导入按预期方式运行时出现问题,python,Python,我很难找出导入机制如何工作的关键点,以及这与组织包的关系 假设我编写了两个或更多不相关的、可重用的库。(我将非正式地使用“library”作为代码和资源的集合,包括测试和可能的数据,而不是正式的Python意义上的“package”)。在名为“my_libraries”的父目录中有两个虚构的库: 我希望完成以下三项,在我看来,所有这些都是正常的做法或期望: 1。子目录中的主库代码 为了保持库组织的整洁,我希望将库的核心代码放在子目录(如“src”)中,而不是放在顶层目录中。(我这里的重点不是讨论

我很难找出导入机制如何工作的关键点,以及这与组织包的关系

假设我编写了两个或更多不相关的、可重用的库。(我将非正式地使用“library”作为代码和资源的集合,包括测试和可能的数据,而不是正式的Python意义上的“package”)。在名为“my_libraries”的父目录中有两个虚构的库:

我希望完成以下三项,在我看来,所有这些都是正常的做法或期望:

1。子目录中的主库代码

为了保持库组织的整洁,我希望将库的核心代码放在子目录(如“src”)中,而不是放在顶层目录中。(我这里的重点不是讨论“src”是否是一种好的命名方法;我已经读了好几页赞成和反对的文章。有些人似乎更喜欢foo/foo的形式,但我想我也会遇到与我描述的相同的问题。)

2。只需向$PYTHONPATH添加一次

我希望能够在$PYTHONPATH或sys.path中只添加一次“我的库”。如果我在“my_libraries”中添加一个新的库,它会自动被我的脚本发现

3。外观正常的导入语句

我希望能够以正常的方式将这些库导入到其他项目中,而不必提及“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