【问题标题】:Avoid export PYTHONPATH every time for __init__.py to work避免每次都导出 PYTHONPATH 以使 __init__.py 正常工作
【发布时间】:2019-01-21 13:37:14
【问题描述】:
`-- MyDir
|-- FolderA
|   |-- __init__.py
|   |-- ScriptA.py
`-- FolderB
    |-- __init__.py
    |-- ScriptB.py

以上是我当前结构的一个示例。在FolderA和FolderB中,__init__.py中都有.from FolderX import *,X是A还是B。

我想运行ScriptB.py,它首先导入FolderAfrom FolderA import *。但是在FolderB下执行python ScriptB.py会报ModuleNotFoundError: No module named 'FolderA'

我目前的解决方法是在每次启动 conda 环境时输入export PYTHONPATH=/path/to/MyDir:$PYTHONPATH。我想问一下这背后的原因以及如何避免这样做。

编辑:看来我应该使用文件夹和脚本来保持简单。

【问题讨论】:

    标签: python import module package sys


    【解决方案1】:

    如果 PackageAPacakgeB 在同一目录级别,您也可以在该目录中添加 __init__.py:

    App
    ----__init__.py
    ----PackageA
    ---- ...
    --------__init__.py
    ----PackageB
    ---- ...
    --------__init__.py
    

    否则,如果这些包是独立开发的,您可以将它们安装为全局包。

    【讨论】:

    • 不知道是不是我理解的正确,只是在MyDir下面加__init__.py是不行的。
    【解决方案2】:

    我可以看到一些解决此问题的方法。首先,我会考虑将它们制作成单个包装的可能性。但是,如果它们显然不是,则可以很快将其丢弃。

    如果它们确实是单独的包,您仍然可以选择。如果已经准备好发布,您当然可以通过pip install 使用setup.py 脚本以及与之相关的所有内容将其安装到您的Python 环境中。请参阅Python packaging tutorial 了解更多信息。

    最后,很可能您仍在计划修改内容。在这种情况下,pip 具有非常方便的功能,可以将软件包安装为符号链接。这样,包是从您开发的目录中读取的。它是通过从存在setup.py 的目录中执行pip install -e . 来完成的。您可以使用“两个”包的通用设置脚本,例如setuptools.find_packages。或者您可以稍微修改文件夹结构,以便为每个包设置不同的设置。现在它们可以作为普通的 Python 包导入。

    【讨论】:

      【解决方案3】:

      使用 conda 开发

      https://conda.io/docs/commands/build/conda-develop.html

      这允许您将目录添加到您选择的环境的站点包中的 conda.pth 文件中,该文件将自动添加到您的 pythonpath 中。

      conda develop ~/path/to/work_in_progress/code/ -n environment_name
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-22
        • 2021-11-25
        • 1970-01-01
        • 2020-08-25
        • 2015-09-24
        • 1970-01-01
        • 2014-10-31
        • 2021-12-16
        相关资源
        最近更新 更多