pyinstaller onefile, но все еще импортирует внешнюю библиотеку, если она доступна - PullRequest
0 голосов
/ 13 июня 2019

Я упаковываю приложение python с помощью «pyinstaller --onefile myapp.py», который создает один исполняемый файл, и приложение прекрасно работает.Теперь я хотел бы иметь возможность импортировать модуль из системы, если он существует, и в противном случае использовать связанный модуль из одного исполняемого файла.Я специально хочу импортировать PySide2 из системы, если она установлена, и в идеале с настраиваемым флагом, который указывает, должно ли приложение загружаться из системы или из одного исполняемого файла.Я уже использую файл конфигурации, который читается одним исполняемым файлом, поэтому я мог бы поставить там флаг, чтобы указать, как загрузить модуль.Есть ли способ сделать это?

Псевдокод будет выглядеть примерно так:

read import_external from configuration file
if import_external is true:
    try:
        import PySide2 from system
    except:
        import PySide2 from executable

РЕДАКТИРОВАТЬ Я близок к решению.Я могу импортировать один файл Python динамически из исполняемого файла pyinstaller onefile, как в приведенном ниже коде, где я создал фиктивный файл "PySide2.py" с простым оператором печати для проверки его импортированности.

import os
print("Import test")
if os.path.isfile('./PySide2.py'):
    print('Importing local PySide2')
    import importlib
    import importlib.util
    spec = importlib.util.spec_from_file_location('PySide2', './PySide2.py')
    module = importlib.util.module_from_spec(spec)
    spec.loader.exec_module(module)
else:
    print('Importing system PySide2')
    import PySide2
    print(PySide2.__version__)
print("Import complete")

НоPySide2 - это не один файл, поэтому теперь мне нужно понять, как импортировать из каталога.Любой совет приветствуется!

РЕДАКТИРОВАТЬ 2 Я нашел решение здесь: Python использует importlib для импорта модуля из каталога пакетов

1 Ответ

0 голосов
/ 17 июня 2019

После еще нескольких исследований и публикации я получил следующее решение (из этого сообщения ).

import os, sys
if os.path.isdir('./PySide2/'):
    print('Importing local PySide2')
    import importlib.util

    MODULE_PATH = "./PySide2/__init__.py"
    MODULE_NAME = "PySide2"

    spec = importlib.util.spec_from_file_location(MODULE_NAME, MODULE_PATH)
    PySide2 = importlib.util.module_from_spec(spec)
    sys.modules[spec.name] = PySide2
    spec.loader.exec_module(PySide2)

    print(PySide2.__version__)
else:
    print('Importing system PySide2')
    import PySide2
    print(PySide2.__version__)
...