为 python 包导入内部模块

Importing internal modules for a python package

我知道这个问题可能存在重复问题,所以我提前表示歉意,因为我花了很多时间进行挖掘,但未能找到它。

我正在尝试使我的 python 软件包 svmksalesforce 可安装,以便与我的同事共享。我正在努力设置我的内部导入,以便它们在安装包时以及在 building/testing 包时直接执行包模块时它们都能工作。

例如,为了子类化我的 Insert 以创建一个 BulkInsert 子类,在构建包时,在我的 bulk_insert.py 文件中,我有以下导入语句:from insert import Insert。这在执行 bulk_insert.py (__name__ == '__main__').

时执行得很好

但是,在安装完我的包后,我在执行 import svmksalesforce 时收到以下错误:

    from insert import Insert
ModuleNotFoundError: No module named 'insert'

完成 some research 后,我确定我需要从顶级父目录导入,因此我将 bulk_query.py 中的导入更新为:from svmksalesforce.insert import Insert.

此导入结构允许我 运行 import svmksalesforce 并允许我与同事共享包,但现在当我添加新功能时,我无法再执行 bulk_query.py 直接。我再次收到导入错误:

    from svmksalesforce.insert import Insert
ModuleNotFoundError: No module named 'svmksalesforce'

我发现这个 post 解释了导入失败的原因,但我似乎找不到在 __name__ == '__main__'(直接执行)和 __name__ == 'svmksalesforce' 时都有效的解决方案(通过导入执行)

现在我在需要添加新功能时更新所有导入语句,然后在需要创建新 sdist 时将它们全部更新回来。每次我再创建一个提到恢复导入语句的提交时,我都会死在里面。

如果有人能帮我减轻痛苦,我将不胜感激。

目录结构:

我最终找到了一个似乎有效的解决方案。

  1. 创建虚拟环境以在直接执行包中的模块时使用
  2. 激活您的虚拟环境
  3. 运行pip install -e ~/path/to/package。在此示例中,您的 setup.py 文件应位于 package 文件夹中。

此过程会将软件包安装到 editable mode 中的虚拟环境。这意味着您对包中的模块所做的任何更改都会立即反映在虚拟环境中包的安装版本中,就像您直接构建和执行内部模块一样。

这样您就可以导入,就像包目录始终是 top-level 目录一样。在问题描述中的示例中,我最终使用了 from svmksalesforce.insert import Insert