Нужно создать хук для smartsheet- python -sdk и PyInstaller - PullRequest
1 голос
/ 07 февраля 2020

Хорошо, здесь много информации, но это результат того, что я несколько дней искал это решение. Я видел, как многие люди задают этот вопрос в разных формах, но не дают хорошего ответа, и я думаю, что я действительно близок к его решению!

У меня есть полностью работающий сценарий python, который использует smartsheet- * Модуль 1053 * -sdk, но когда я запускаю его как exe-файл, связанный с Pyinstaller, он считывает объекты smartsheet в виде строк, и я не могу получить доступ ни к одному из атрибутов. Модуль имеет подпапку с названием «models», а другая подпапка называется «enums». Я подумал, что мне нужно создать крючок для их импорта, поэтому я попытался его создать, но все равно не повезло. Хуки читались при компиляции, но они не работали.

Для справки приведена структура пакета smartsheet .

Информация о системе

Все самые актуальные версии: Python 3.7 Pyinstaller 3.6 Smartsheet 2.86

Операционная система: Windows 10

Пока предпринимаются попытки

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

Это попытка подключения, которую я создал для smartsheet.models:

from PyInstaller.utils.hooks import collect_submodules

hiddenimports = collect_submodules('smartsheet.models')

По какой-то возможной причине это не работает

Я думаю, что это как-то связано с информацией в файлах модуля init , но я не уверен, что с этим делать. init из основного модуля имеет следующий оператор:

from .smartsheet import Smartsheet, fresh_operation, AbstractUserCalcBackoff  # NOQA

, а init из подмодуля моделей содержит операторы для импорта отдельных моделей, найденных в directory:

from __future__ import absolute_import

# import models into model package
from .access_token import AccessToken
from .account import Account
from .alternate_email import AlternateEmail
from .attachment import Attachment
from .auto_number_format import AutoNumberFormat
# This continues for other models

Так что я думаю, что мне нужно каким-то образом mimi c этот оператор импорта модели в моем файле ловушек, но я не знаю, как это сделать.

Код & Сообщение об ошибке:

Он создает основной объект smartsheet нормально, поскольку он не ссылается ни на один из элементов подмодуля:

# Creates a smartsheet object for an account with an api access token
ss = smartsheet.Smartsheet(a_token)

Но все, что ссылается на подмодули в этом объекте, завершается ошибкой

ss.Sheets.get_sheet(residential_id)

Это сообщение об ошибке, которое я получаю при запуске программы:

ImportError! Could not load api or model class Users

# print statement I added to show the string object that is supposed to be a smartsheet object
<smartsheet.smartsheet.Smartsheet object at 0x00000292D4232408> 

Exception type: AttributeError 

Exception message: 'str' object has no attribute 'get_sheet' 

Stack trace:  
 File: sum_report.py
    Line: 516
    Function nameName: main 
    Message: 

 File: snow_functions.py
    Line: 437
    Function nameName: connect_smartsheet 
    Message: 

1 Ответ

0 голосов
/ 25 февраля 2020

Я столкнулся с той же проблемой. Я обнаружил, что вы должны добавить все отдельные модули, которые вам нужны, в качестве скрытого импорта.

Откройте файл .spe c, который был создан. Если вы ранее использовали pyinstaller script.py, найдите файл script.spec в каталоге скриптов. Откройте его и измените раздел:

hiddenimports=[
    'smartsheet.models'
    'smartsheet.sheets',
    'smartsheet.search',
    'smartsheet.users'  
    ]

Затем запустите pyinstaller script.spec, чтобы использовать файл spe c со скрытым импортом. Попробуйте запустить свой пакет снова. Возможно, вам понадобится добавить дополнительные модули в массив скрытых импортов, если ваш скрипт снова не удастся (просто посмотрите на модуль, на который ссылается ошибка.)

Я наконец-то начал работать после добавления моделей, листов и поиска.

...