Как заставить setuptools установить колесо, содержащее несколько пакетов? - PullRequest
0 голосов
/ 03 декабря 2018

Предположим, это колесо:

M Filemode      Length  Date         Time      File
- ----------  --------  -----------  --------  -------------------------------------------
  -rw-rw-r--      1358  26-Sep-2018  21:08:40  azure/common/__init__.py
  -rw-rw-r--       327  26-Sep-2018  21:08:40  azure/common/_version.py
  -rw-rw-r--      8737  26-Sep-2018  21:08:40  azure/common/client_factory.py
  -rw-rw-r--       755  26-Sep-2018  21:08:40  azure/common/cloud.py
  -rw-rw-r--      2479  26-Sep-2018  21:08:40  azure/common/credentials.py
  -rw-rw-r--       805  26-Sep-2018  21:08:40  azure/common/exceptions.py
  -rw-rw-r--      6079  26-Sep-2018  21:08:40  azure/profiles/__init__.py
  -rw-rw-r--      3943  26-Sep-2018  21:08:40  azure/profiles/multiapiclient.py
  -rw-rw-r--         6  26-Sep-2018  21:21:54  azure_common-1.1.16.dist-info/top_level.txt
  -rw-rw-r--       110  26-Sep-2018  21:21:54  azure_common-1.1.16.dist-info/WHEEL
  -rw-rw-r--      3805  26-Sep-2018  21:21:54  azure_common-1.1.16.dist-info/METADATA
  -rw-rw-r--       997  26-Sep-2018  21:21:54  azure_common-1.1.16.dist-info/RECORD
- ----------  --------  -----------  --------  -------------------------------------------
                 29401                         12 files

В нем три разных пакета:

  • azure.common
  • azure.profiles
  • azure_common

Все великие имена и отличный макет.Кроме того, большое величие ума, которое безошибочно вошло в разработку этого чуда современной разработки программного обеспечения.

Это колесо носит название azure-common.Таким образом, когда вы зависите от in setup.py следующим образом:

setup(
    ...
    install_requires=['azure-common'],
    ...
)

Вы получите только установленный пакет azure_common.Может быть.На самом деле я не знаю, кажется, но несколько раз, когда я пытался это сделать, мне показалось, что он установил только azure.common, или, может быть, я это сделал ... Мне действительно трудно следовать всем манипуляциям, которые setuptools делает с пакетом.

Отсюда возникает вопрос: как я могу заставить setuptools установить все пакеты, найденные в этом виде колеса?Кроме того, порядок важен, потому что этот мусор должен быть установлен иногда с другими пакетами, которые также предоставляют пакеты azure.something, которые могут перезаписать материал в каталоге azure.Итак, в идеале, я также хотел бы контролировать, в каком порядке install_requires обрабатываются зависимости.


Вот где это началось: Как указать скобочные зависимости в setup.py?

1 Ответ

0 голосов
/ 26 декабря 2018

Похоже, что только несколько подкаталогов, таких как azure.common, установлены в вашей среде, когда вы устанавливаете зависимости через setup.py с install_requires=['azure-common'].Я пытался воспроизвести эту проблему, но не смог установить все файлы в этом пакете.

Ниже приведены мои шаги на моем локальном компьютере с Windows, к которым вы можете обратиться.

  1. Создайте каталог mkdir setuptmp и создайте виртуальную среду virtualenv setuptmp, затем cd setuptmp.
  2. Создайте файл setup.py с содержимым, как показано ниже. \

    from setuptools import setup, find_packages  
    
    setup(
        name = "setuptmp",
        install_requires = ['azure-common']
    )
    
  3. Активируйте виртуальную среду с помощью Scripts\activate.bat.

  4. Запустите python setup.py install, чтобы установить зависимость, описанную в моем setup.py.
  5. Запустите python, чтобы открыть интерпретатор REPL для проверки всех пакетов, как вы сказали,

    (setuptmp) D:\projects\setuptmp>python
    Python 3.7.1 (v3.7.1:260ec2c36a, Oct 20 2018, 14:57:15) [MSC v.1915 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import azure.common
    >>> import azure.profiles
    >>> azure.common.__file__
    'D:\\projects\\setuptmp\\lib\\site-packages\\azure_common-1.1.16-py3.7.egg\\azure\\common\\__init__.py'
    >>> azure.profiles.__file__
    'D:\\projects\\setuptmp\\lib\\site-packages\\azure_common-1.1.16-py3.7.egg\\azure\\profiles\\__init__.py'
    >>> import azure_common
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ModuleNotFoundError: No module named 'azure_common'
    

Примечание: azure_common - это не модуль, просто каталог информации о яйцах.

Проверьте пакеты, установленные в моей среде, с помощью cd Lib\site-packages, dir и tree azure_common-1.1.16-py3.7.egg /F, как показано ниже.

(setuptmp) D:\projects\setuptmp\Lib\site-packages>dir
 Volume in drive D is Data
 Volume Serial Number is BA4B-64AA

 Directory of D:\projects\setuptmp\Lib\site-packages

2018/12/26  14:48    <DIR>          .
2018/12/26  14:48    <DIR>          ..
2018/12/26  14:48    <DIR>          azure_common-1.1.16-py3.7.egg
2018/12/26  14:48                61 easy-install.pth
2018/12/26  14:46               126 easy_install.py
2018/12/26  14:46    <DIR>          pip
2018/12/26  14:46    <DIR>          pip-18.1.dist-info
2018/12/26  14:46    <DIR>          pkg_resources
2018/12/26  14:48               965 setuptmp-0.0.0-py3.7.egg
2018/12/26  14:46    <DIR>          setuptools
2018/12/26  14:46    <DIR>          setuptools-40.6.3.dist-info
2018/12/26  14:46    <DIR>          wheel
2018/12/26  14:46    <DIR>          wheel-0.32.3.dist-info
2018/12/26  14:46    <DIR>          __pycache__
               3 File(s)          1,152 bytes
              11 Dir(s)  80,896,319,488 bytes free

(setuptmp) D:\projects\setuptmp\Lib\site-packages>tree azure_common-1.1.16-py3.7.egg /F
Folder PATH listing for volume Data
Volume serial number is BA4B-64AA
D:\PROJECTS\SETUPTMP\LIB\SITE-PACKAGES\AZURE_COMMON-1.1.16-PY3.7.EGG
├─azure
│  ├─common
│  │  │  client_factory.py
│  │  │  cloud.py
│  │  │  credentials.py
│  │  │  exceptions.py
│  │  │  _version.py
│  │  │  __init__.py
│  │  │
│  │  └─__pycache__
│  │          _version.cpython-37.pyc
│  │          __init__.cpython-37.pyc
│  │
│  └─profiles
│          multiapiclient.py
│          __init__.py
│
└─EGG-INFO
        PKG-INFO
        RECORD
        requires.txt
        top_level.txt
        WHEEL

Сравните приведенное выше со структурой файлапакета azure-common, загруженного с ссылки сайта Pypi.Я распаковал azure_common-1.1.16-py2.py3-none-any.whl файл, используя 7-Zip, во временный каталог и tree it.

D:\tmp>tree azure_common-1.1.16-py2.py3-none-any /F
Folder PATH listing for volume Data
Volume serial number is BA4B-64AA
D:\tmp\AZURE_COMMON-1.1.16-PY2.PY3-NONE-ANY
├─azure
│  ├─common
│  │      client_factory.py
│  │      cloud.py
│  │      credentials.py
│  │      exceptions.py
│  │      _version.py
│  │      __init__.py
│  │
│  └─profiles
│          multiapiclient.py
│          __init__.py
│
└─azure_common-1.1.16.dist-info
        METADATA
        RECORD
        top_level.txt
        WHEEL

Затем вы найдете файловую структуру шага 6 & 7 почти то же самое.

Надеюсь, это поможет.Если у вас есть какие-либо вопросы, пожалуйста, дайте мне знать.


Я проделал то же самое с Linux и получил тот же результат.Я сохранил вывод tree lib/ > lib_[before|after].txt моего Linux setuptmp до и после запуска python setup.py install, а затем сравнил их, используя diff lib_*.txt, как показано ниже.

(setuptmp) peter@peterpc:~/setuptmp$ diff lib*.txt
92a93,111
>     │   ├── azure_common-1.1.16-py3.6.egg
>     │   │   ├── EGG-INFO
>     │   │   │   ├── PKG-INFO
>     │   │   │   ├── RECORD
>     │   │   │   ├── WHEEL
>     │   │   │   ├── requires.txt
>     │   │   │   └── top_level.txt
>     │   │   └── azure
>     │   │       ├── common
>     │   │       │   ├── __init__.py
>     │   │       │   ├── _version.py
>     │   │       │   ├── client_factory.py
>     │   │       │   ├── cloud.py
>     │   │       │   ├── credentials.py
>     │   │       │   └── exceptions.py
>     │   │       └── profiles
>     │   │           ├── __init__.py
>     │   │           └── multiapiclient.py
>     │   ├── easy-install.pth
827a847
>     │   ├── setuptmp-0.0.0-py3.6.egg
1043c1063
< 118 directories, 922 files
---
> 123 directories, 937 files
...