Есть ли способ импортировать пакет Python из другого пакета Python, как если бы он был частью того же кода? - PullRequest
0 голосов
/ 28 октября 2019

Допустим, у нас есть пакеты Python package_a и package_b. Как пользователь, я хочу иметь возможность сказать:

from package_a.package_b import some_functionality

У меня вопрос: есть ли способ поддержать это без буквального копирования кода package_b в package_a? * 1008? *

EDIT 1:

Чтобы уточнить, у меня есть теневое именование (мой пакет python назван так же, как моя папка), и мне интересно, есть ли способ сделать пакет python доступным где-нибудьеще.

И да, я ищу способы переименования пакета / папки таким образом, чтобы это все еще имело смысл в домене.

Ответы [ 2 ]

1 голос
/ 28 октября 2019

Это злоупотребление модульной системой Python, и я призываю вас пересмотреть этот дизайн, но если вам действительно нужно, вы можете сделать это, связавшись с sys.modules:

In package_a/__init__.py:

import sys
import package_b

sys.modules[__name__ + '.package_b'] = package_b

Вы можете увидеть что-то подобное в стандартной библиотеке lib, os.path является либо модулем ntpath, либо posixpath в зависимости от платформы, ни один из которых на самом деле не является частью os (этоне может быть, os это модуль, а не пакет).

https://github.com/python/cpython/blob/master/Lib/os.py

sys.modules['os.path'] = path
0 голосов
/ 29 октября 2019

С setuptools вы можете сделать что-то вроде этого:

Project
├── setup.py
└── src
    ├── package_a
    │   └── __init__.py
    └── package_b
        └── __init__.py

setup.py

#!/usr/bin/env python3

import setuptools

setuptools.setup(
    name='Project',
    version='0.0.7',
    packages=[
        'package_a',
        'package_b',
        'package_a.package_b',
    ],
    package_dir={
        'package_a': 'src/package_a',
        'package_b': 'src/package_b',
        'package_a.package_b': 'src/package_b',
    },
)

Это эффективно установит две копии package_b,один в качестве пакета верхнего уровня, а другой в качестве подпакета package_a. Это может быть проблемой, так как, например, если у вас есть глобальные переменные в package_b, тогда они не будут иметь того же значения, что и глобальная переменная в package_a.package_b. Но это также может быть положительным побочным эффектом, в зависимости от вариантов использования.

...