Python 包创建

Python Package Creation

我有一个要创建的包。目录层次结构如下所示。

Package/
    __init__.py
    Part1/
        __init__.py
        item.py
        load_items.py
    Part2/
        __init__.py
        section.py
    Part3/
        __init__.py
        mappings/
            file1.txt
            file2.txt
            ...
            file10.txt
        map.py
        unmapped.txt

我还有一些其他文件 main.py 不在包中,但我已将其放入

import Package
print(dir(Package))

这个输出是

['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__']

但是我希望在此列表中看到“第 1 部分”、“第 2 部分”和“第 3 部分”。我也试过了

print(Package.Part1)

我收到一个属性错误:包没有属性 Part1。

这是我制作的第一个包,我也不确定为什么每个目录都需要__init__.py?或许这是错误的,但事实并非如此。我已经阅读了一堆关于堆栈溢出的其他问题,但其中 none 确实帮助我理解了。基本上,我正在寻找我的包的结构是否正确以及为什么当我执行 dir(Package) 时它的部分没有列出。

dir return 一个对象的所有变量和方法

例如:

class Person:
  name = "John"

  def foo(self):
        return "Hello"

print(dir(Person))

>> out 
    [... 'foo', 'name']

如果要列出目录下的所有目录和文件,可以这样做

import os
os.listdir(path)

您可以使用 importlib

检索已安装包的路径

这里是 requests

的例子
import importlib.util
path = importlib.util.find_spec("requests").origin

>> out : 
    ..../python3.7/site-packages/requests/__init__.py'

结合这两种方法,我们可以列出包的所有目录

import importlib.util
import os

path = importlib.util.find_spec("requests").origin

# remove the "/__init__.py" part
path = path[:-11]
os.listdir(path)

>> out : 
    ['cookies.py',
     'auth.py',
     'sessions.py',
      ...
     ]

每个目录都需要__init__.py。 该文件告诉您的 python 解释器该文件夹是一个 python 包。没有它,您将无法在其他文件夹中导入包。