Python Package _init _; py.py是否导入所有子文件,但仅从另一个脚本加载一个子文件?

Python Package _init _; py.py是否导入所有子文件,但仅从另一个脚本加载一个子文件?,python,python-3.x,package,Python,Python 3.x,Package,我已创建具有以下文件结构的包: - package - __init__.py - load.py - train.py - test.py 我的\uuuu init\uuuu.py文件只是这些文件的类的导入: from package.load import Load from package.train import Train from package.test import Test 大多数时候,我想加载所有三个类,但有时我只想专门加载其中一个类。例如,在一个特别脚本

我已创建具有以下文件结构的包:

- package
  - __init__.py
  - load.py
  - train.py
  - test.py
我的
\uuuu init\uuuu.py
文件只是这些文件的类的导入:

from package.load import Load
from package.train import Train
from package.test import Test
大多数时候,我想加载所有三个类,但有时我只想专门加载其中一个类。例如,在一个特别脚本(在包之外)中,我希望能够只调用Load类,如下所示:

from package import Load
虽然上述所有功能都在本设计中发挥作用,但我遇到了一个问题,即当我像上面那样导入
Load
时,也会加载来自训练/测试的依赖项。如何设置
\uuuu init\uuuuuu.py
文件,以便在不获取从训练/测试加载的依赖项的情况下进行相同的
导入
调用

补充说明:


我这样做的原因:我有一个问题,我希望一些人能够使用
Load
类,该类只使用基本python,但是训练/测试文件包含专门的依赖项,这些依赖项仅仅是Load类的用户不想使用甚至不想安装。

这里有一种方法可以做一些非常接近您想要的事情。与无条件地导入
不同,您可以在
\uuu init\uuuu.py
中定义一个函数来显式导入所需的任何类(如果未指定,则全部导入)

\uuuu init\uuuuu.py

from pathlib import Path
import sys

print(f'In {Path(__file__).name}')

package_name = Path(__file__).parent.name
package_prefix = package_name + '.'
class_to_module_map = {'Load': 'load', 'Train': 'train', 'Test': 'test'}


def import_classes(*class_names):
    namespace = sys._getframe(1).f_globals  # Caller's globals.

    if not class_names:
        class_names = class_to_module_map.keys()  # Import them all.

    for class_name in class_names:
        module = class_to_module_map[class_name]
        temp = __import__(package_prefix+module, globals(), locals(), [class_name])
        namespace[class_name] = getattr(temp, class_name)  # Add to caller's namespace.
from pathlib import Path

print(f'In {Path(__file__).name}')

class Load: pass
from my_package import import_classes

#from my_package import Load
import_classes('Load')

test = Load()
print(test)
出于测试目的,以下是我在
load.py
脚本中输入的内容:
(我还在其他两个模块中添加了类似的内容,以验证它们是否得到了
import
ed。)

load.py

from pathlib import Path
import sys

print(f'In {Path(__file__).name}')

package_name = Path(__file__).parent.name
package_prefix = package_name + '.'
class_to_module_map = {'Load': 'load', 'Train': 'train', 'Test': 'test'}


def import_classes(*class_names):
    namespace = sys._getframe(1).f_globals  # Caller's globals.

    if not class_names:
        class_names = class_to_module_map.keys()  # Import them all.

    for class_name in class_names:
        module = class_to_module_map[class_name]
        temp = __import__(package_prefix+module, globals(), locals(), [class_name])
        namespace[class_name] = getattr(temp, class_name)  # Add to caller's namespace.
from pathlib import Path

print(f'In {Path(__file__).name}')

class Load: pass
from my_package import import_classes

#from my_package import Load
import_classes('Load')

test = Load()
print(test)
最后,这里是一个仅用于导入
类的
示例:

ad_hoc.py

from pathlib import Path
import sys

print(f'In {Path(__file__).name}')

package_name = Path(__file__).parent.name
package_prefix = package_name + '.'
class_to_module_map = {'Load': 'load', 'Train': 'train', 'Test': 'test'}


def import_classes(*class_names):
    namespace = sys._getframe(1).f_globals  # Caller's globals.

    if not class_names:
        class_names = class_to_module_map.keys()  # Import them all.

    for class_name in class_names:
        module = class_to_module_map[class_name]
        temp = __import__(package_prefix+module, globals(), locals(), [class_name])
        namespace[class_name] = getattr(temp, class_name)  # Add to caller's namespace.
from pathlib import Path

print(f'In {Path(__file__).name}')

class Load: pass
from my_package import import_classes

#from my_package import Load
import_classes('Load')

test = Load()
print(test)
随着产出的增加:

In __init__.py
In load.py
<my_package.load.Load object at 0x001FE4A8>
In\uuuu init\uuuuu.py
在load.py中

“但是,训练/测试文件包含专门的依赖项,仅Load类的用户不想使用或甚至不想安装这些依赖项。”然后
打包。Load
可能应该单独打包,不是吗?一般来说,您可能是正确的。在这种情况下,软件包是一个通用软件包,单个团队将广泛使用该软件包进行各种项目,其目的是将软件包保存在单个导入调用中(主要是利用环境变量)。问题在于,用户拥有广泛的技术知识,而且一些更复杂的依赖关系比尝试安装它们更麻烦。