Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.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 3.x 导入python包的内部模块_Python 3.x_Python Import_Python Packaging - Fatal编程技术网

Python 3.x 导入python包的内部模块

Python 3.x 导入python包的内部模块,python-3.x,python-import,python-packaging,Python 3.x,Python Import,Python Packaging,我知道这个问题很可能有重复的地方,所以我提前道歉,因为我花了大量时间挖掘,但一直没能找到它 我正试图使我的python包,svmksalesforce,可安装,以便与同事共享。我正在努力设置我的内部导入,以便它们在安装包时以及在构建/测试包时直接执行包模块时都能工作 例如,为了将myInsert子类化以创建BulkInsert子类,在构建包时,在my bulk\u Insert.py文件中,我有以下导入语句:from Insert import。执行bulk_insert.py(\uuuu na

我知道这个问题很可能有重复的地方,所以我提前道歉,因为我花了大量时间挖掘,但一直没能找到它

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

例如,为了将my
Insert
子类化以创建
BulkInsert
子类,在构建包时,在my bulk\u Insert.py文件中,我有以下导入语句:
from Insert import
。执行bulk_insert.py(
\uuuu name\uuuuu=='\uuuuuu main\uuuu'
)时,该命令执行良好

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

    from insert import Insert
ModuleNotFoundError: No module named 'insert'
完成后,我决定改为从顶级父目录导入,因此我将bulk_query.py中的导入更新为:
from svmksalesforce.insert import

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

    from svmksalesforce.insert import Insert
ModuleNotFoundError: No module named 'svmksalesforce'
我发现这解释了导入失败的原因,但我似乎找不到一个既能在
\uuuuuu name\uuuuu=='\uuuu main\uuuuu'
(直接执行)又能在
\uuuuu name\uuuuuuu=='svmksalesforce'
时工作的解决方案(通过导入执行)

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

我会非常感激任何能帮我减轻痛苦的人

目录结构:


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

  • 创建一个虚拟环境,以便在直接执行包中的模块时使用
  • 激活您的虚拟环境
  • 运行
    pip安装-e~/path/to/package
    。在本例中,setup.py文件应位于
    package
    文件夹中
  • 此过程将包安装到中的虚拟环境中。这意味着您对包中的模块所做的任何更改都会立即反映在虚拟环境中已安装的包版本中,就像您直接构建和执行内部模块一样


    这允许您随后导入,就好像包目录始终是顶级目录一样。在问题描述中的示例中,我最终使用了svmksalesforce.insert的
    “导入插入”

    请指定哪个代码示例属于哪个文件。两个导入片段都来自bulk_query.py文件。我在直接在包中执行时使用一种导入语法,在导入包时使用一种导入语法这里没有bulk_query.py文件…哪个IDE?Pycharm?此外,您可能会发现“相对导入路径”的概念很有用:。例如,如果要从
    共享函数py
    访问
    批量插入
    包,可以从.insert.bulk\u插入导入。