Распределенный почтовый индекс Python со всеми зависимостями - PullRequest
0 голосов
/ 27 мая 2019

Я пытаюсь создать простой проект с такими зависимостями, как requests, и создать распределенный zip-файл с помощью следующей команды: python3.6 setup.py bdist --format=zip. В дистрибутивном zip-файле также должен быть создан package.zip со следующим скриптом bash:

#!/bin/bash
pip install -r requirements.txt --target ./packages
if [[ -d packages ]]; then
    cd packages
    find . -name "*.pyc" -delete
    find . -name "*.egg-info" | xargs rm -rf
    zip -9mrv packages.zip .
    mv packages.zip ..
    cd ..
    rm -rf packages
fi

Окончательный ZIP-файл содержит следующие файлы:


Archive:  dist/test_python_zip-1.0.linux-x86_64.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2019-05-27 12:37   src/
        0  2019-05-27 12:37   __pycache__/
        0  2019-05-27 12:37   commands/
      187  2019-05-27 12:37   test_python_zip-1.0-py3.6.egg-info
        0  2019-05-22 19:18   __init__.py
      222  2019-05-27 12:34   __main__.py
        0  2019-05-27 12:37   src/commands/
        0  2019-05-27 12:37   src/commands/__pycache__/
       28  2019-05-22 17:47   src/commands/buy.py
       18  2019-05-22 19:02   src/commands/__init__.py
      246  2019-05-22 18:39   src/commands/hello.py
       30  2019-05-22 17:47   src/commands/start.py
      125  2019-05-27 12:37   src/commands/__pycache__/__init__.cpython-36.pyc
      337  2019-05-27 12:37   src/commands/__pycache__/hello.cpython-36.pyc
      214  2019-05-27 12:37   src/commands/__pycache__/start.cpython-36.pyc
      210  2019-05-27 12:37   src/commands/__pycache__/buy.cpython-36.pyc
       95  2019-05-27 12:37   __pycache__/__init__.cpython-36.pyc
      403  2019-05-27 12:37   __pycache__/__main__.cpython-36.pyc
        0  2019-05-27 12:37   commands/__pycache__/
       28  2019-05-22 17:47   commands/buy.py
       18  2019-05-22 19:02   commands/__init__.py
      246  2019-05-22 18:39   commands/hello.py
       30  2019-05-22 17:47   commands/start.py
      121  2019-05-27 12:37   commands/__pycache__/__init__.cpython-36.pyc
      333  2019-05-27 12:37   commands/__pycache__/hello.cpython-36.pyc
      210  2019-05-27 12:37   commands/__pycache__/start.cpython-36.pyc
      206  2019-05-27 12:37   commands/__pycache__/buy.cpython-36.pyc
---------                     -------
     3307                     27 files

Содержимое файла setup.py:

from distutils.command.bdist_dumb import bdist_dumb
from distutils.core import setup


class custom_bdist_dumb(bdist_dumb):

    def reinitialize_command(self, name, **kw):
        cmd = bdist_dumb.reinitialize_command(self, name, **kw)
        if name == 'install':
            cmd.install_lib = '/'
        return cmd


if __name__ == '__main__':
    setup(
        # our custom class override
        cmdclass={'bdist_dumb': custom_bdist_dumb},
        name='test_python_zip',
        version="1.0",
        py_modules=['__main__'],
        packages=['lib', 'src/commands'])

Дерево проекта выглядит следующим образом:


.
├── build
│   ├── bdist.linux-x86_64
│   ├── lib
│   │   ├── commands
│   │   │   ├── buy.py
│   │   │   ├── hello.py
│   │   │   ├── __init__.py
│   │   │   └── start.py
│   │   ├── __init__.py
│   │   ├── __main__.py
│   │   └── src
│   │       └── commands
│   │           ├── buy.py
│   │           ├── hello.py
│   │           ├── __init__.py
│   │           └── start.py
│   └── lib.linux-x86_64-2.7
│       └── commands
│           ├── buy.py
│           ├── hello.py
│           ├── __init__.py
│           └── start.py
├── dist
│   └── test_python_zip-1.0.linux-x86_64.zip
├── __main__.py
├── packages.sh
├── packages.zip
├── __pycache__
├── requirements.txt
├── setup.py
├── src
│   ├── commands
│   │   ├── buy.py
│   │   ├── hello.py
│   │   ├── hello.pyc
│   │   ├── __init__.py
│   │   ├── __init__.pyc
│   │   ├── __pycache__
│   │   └── start.py
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── packages.zip
│   └── test_python_zip.egg-info
│       ├── dependency_links.txt
│       ├── PKG-INFO
│       ├── SOURCES.txt
│       └── top_level.txt
└── test_python_zip.egg-info
    ├── dependency_links.txt
    ├── PKG-INFO
    ├── SOURCES.txt
    └── top_level.txt

Наконец, содержимое файла main .py:

import sys

if not ('packages.zip' in sys.path):
    sys.path.insert(0, 'packages.zip')
print(sys.version)
print("\n \n")
print(sys.path)
from src.commands import hello


def main():
    hello.call()


if __name__ == '__main__':
    main()

Проблема здесь в том, что зависимость requirements не загружается из файла package.zip и, если он не установлен, я получил следующую ошибку:

3.7.3 (default, Apr  3 2019, 05:39:12)
[GCC 8.3.0]



['lib', 'dist/test_python_zip-1.0.linux-x86_64.zip', '/usr/lib/python37.zip', '/usr/lib/python3.7', '/usr/lib/python3.7/lib-dynload', '/home/yborisov/.local/lib/python3.7/site-packages', '/usr/local/lib/python3.7/dist-packages', '/usr/lib/python3/dist-packages']
Traceback (most recent call last):
  File "/usr/lib/python3.7/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.7/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "dist/test_python_zip-1.0.linux-x86_64.zip/__main__.py", line 8, in <module>
  File "dist/test_python_zip-1.0.linux-x86_64.zip/src/commands/hello.py", line 1, in <module>
ModuleNotFoundError: No module named 'requests'

В чем должна быть проблема и как я могу ее решить?

1 Ответ

0 голосов
/ 28 мая 2019

Вместо использования package.zip в последнем zip-файле я использовал папку package , которую я переместил в src .Я добавил MANIFEST.in с содержимым

include  packages __main__.py
recursive-include  src/commands *

Файл setup.py был изменен на

from distutils.command.bdist_dumb import bdist_dumb
from distutils.core import setup

from setuptools import find_packages


class CustomBdistDumb(bdist_dumb):

    def reinitialize_command(self, name, **kw):
        cmd = bdist_dumb.reinitialize_command(self, name, **kw)
        if name == 'install':
            cmd.install_lib = '/'
        return cmd


setup(
    # our custom class override
    cmdclass={'bdist_dumb': CustomBdistDumb},
    name='test_python_zip',
    version="1.0",
    package_data={
        '': ['packages']
    },
    py_modules=['__main__'],
    packages=find_packages(),
)

, а модуль request загружается непосредственно из папки packages :

from src.packages import requests

URL = "https://api.ipify.org/?format=json"

def call():
    # sending get request and saving the response as response object
    r = requests.get(url=URL)

    # extracting data in json format
    data = r.json()
    print(data)
...