我知道这个问题很可能会重复出现,所以我花了很多时间在挖掘上,但未能找到它,所以我提前道歉。
我正在尝试安装可安装的python软件包svmksalesforce
,以便与同事共享。我正在努力设置内部导入,以便它们在安装软件包时以及在构建/测试软件包时直接执行软件包模块时都可以使用。
例如,为了在构建包时将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时将其全部更新。每次我再创建一个提及恢复导入语句的提交时,我都会在里面死掉。
对于任何能够为我省去痛苦的人都将非常感激。
目录结构:
答案 0 :(得分:1)
我最终找到了一个似乎有效的解决方案。
pip install -e ~/path/to/package
。在此示例中,您的setup.py文件应位于package
文件夹中。此过程将软件包安装到editable mode中的虚拟环境中。这意味着您对软件包中的模块所做的任何更改都会立即反映在虚拟环境中软件包的已安装版本中,就像您直接构建并执行内部模块时一样。
这使您可以像打包目录始终是顶级目录一样进行导入。在问题描述的示例中,我最终使用了from svmksalesforce.insert import Insert