Использование модулей Python на основе C в заархивированных каталогах Python

Недавно я узнал о способности Python запускать zip-каталог и решил попробовать. Это работает довольно хорошо для небольших чистых программ на Python, которые я тестировал. Однако, как только я перешел к более крупным приложениям, использующим библиотеки на основе языка C, все стало так. У меня есть приложение, которое использует криптографию, и я не могу заставить это работать. Вот как выдает ошибку, которую я вижу:

Это __main__ файл:

# cat __main__.py 
import os
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
backend = default_backend()
key = os.urandom(32)
iv = os.urandom(16)
cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=backend)
encryptor = cipher.encryptor()
ct = encryptor.update(b"a secret message") + encryptor.finalize()
decryptor = cipher.decryptor()
print(decryptor.update(ct) + decryptor.finalize())

И вот как создать заархивированный файл:

#!/bin/bash
set -e
rm -R build/
mkdir build
cp __main__.py build/
pip2 install -v -U --no-cache-dir --target=build/ cryptography
cd build/
zip -r ../test.pyz .

Теперь у меня есть файл test.pyz который я пытаюсь запустить, и я получаю следующую ошибку:

$ python2 test.pyz
Traceback (most recent call last):
  File "/usr/lib64/python2.7/runpy.py", line 162, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "/usr/lib64/python2.7/runpy.py", line 72, in _run_code
    exec code in run_globals
  File "test.pyz/__main__.py", line 4, in <module>
  File "/tmp/tmpZjvIXl/lib/python/cryptography/hazmat/backends/__init__.py", line 35, in default_backend
  File "/tmp/tmpZjvIXl/lib/python/cryptography/hazmat/backends/__init__.py", line 22, in _available_backends
  File "/tmp/pip-build-3JjP5c/setuptools/pkg_resources/__init__.py", line 2235, in resolve
  File "/tmp/tmpZjvIXl/lib/python/cryptography/hazmat/backends/openssl/__init__.py", line 7, in <module>
  File "/tmp/tmpZjvIXl/lib/python/cryptography/hazmat/backends/openssl/backend.py", line 15, in <module>
  File "/tmp/tmpZjvIXl/lib/python/cryptography/x509/__init__.py", line 7, in <module>
  File "/tmp/tmpZjvIXl/lib/python/cryptography/x509/base.py", line 15, in <module>
  File "/tmp/tmpZjvIXl/lib/python/cryptography/x509/extensions.py", line 19, in <module>
  File "/tmp/tmpZjvIXl/lib/python/cryptography/hazmat/primitives/constant_time.py", line 9, in <module>
ImportError: No module named _constant_time

У кого-нибудь есть идеи, как работать с модулями на C в zip-файлах?

Обновить

Как и предполагалось, я попытался упаковать приложение с zipapp и запустить его с Python3, но я все еще вижу ту же ошибку.

Обновление 2

Вот снова полный журнал моей неудачи:

$ pip3.5 install -v -U --no-cache-dir --target=build/ pycryptodome
$ cat build/__main__.py 

from Crypto.Cipher import AES

def main():
    print(bla)

$ python3.5 -m zipapp build
$ python3.5 build.pyz 
Traceback (most recent call last):
  File "/usr/lib64/python3.5/runpy.py", line 170, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib64/python3.5/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "build.pyz/__main__.py", line 2, in <module>
  File "<frozen importlib._bootstrap>", line 969, in _find_and_load
  File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 664, in _load_unlocked
  File "<frozen importlib._bootstrap>", line 634, in _load_backward_compatible
  File "build.pyz/Crypto/Cipher/__init__.py", line 78, in <module>
  File "<frozen importlib._bootstrap>", line 969, in _find_and_load

bal = AES

  File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 664, in _load_unlocked
  File "<frozen importlib._bootstrap>", line 634, in _load_backward_compatible
  File "build.pyz/Crypto/Cipher/_mode_ecb.py", line 46, in <module>
  File "build.pyz/Crypto/Util/_raw_api.py", line 168, in load_pycryptodome_raw_lib
OSError: Cannot load native module 'Crypto.Cipher._raw_ecb'

Не знаю, как использовать модули на основе C внутри заархивированных каталогов...

0 ответов

Другие вопросы по тегам