Как получить доступ к базам данных изнутри pyinstall exe [duplicate]

Вы можете использовать tf.train.summary_iterator , например

my_pairs = []
for e in tf.train.summary_iterator(my_event_file_path):
    for v in e.summary.value:
        if v.tag == my_tag:
            my_pairs.append((e.step, v.simple_value))

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

2
задан emzemzx 21 November 2015 в 03:02
поделиться

2 ответа

Вы сможете получить доступ к файлу SQLite в пакете, но только для чтения. Поэтому новая информация не может быть добавлена. Вы столкнетесь с этой же проблемой с подобными встроенными базами данных.

Вы можете либо упаковать SQLite-файл отдельно, либо клонировать файл и читать файл извне.

1
ответ дан AbsoluteMSTR 21 August 2018 в 00:42
поделиться

Если вы используете параметр -onefile (то есть, связывая все в один исполняемый файл), при запуске your_app_name.exe Pyinstaller распаковывает ваши данные во временную папку, и путь устанавливается как sys._MEIPASS.

def path_to_temp(relative_path):
    try:
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.abspath(".")

    return os.path.join(base_path, relative_path)

Таким образом, ваши файлы данных, которые вы указываете в вашем spec-файле, также будут извлечены во временное место при запуске приложения.

a.datas.append(('sqlite.db', 'sqlite.db', 'DATA'))

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

print  base_path

. Теперь вы также увидите файл своей базы данных. Теперь внесите в него некоторые изменения. Затем закройте приложение и запустите его снова. Получите новое временное местоположение и проверьте, не отразились ли сделанные вами изменения. Ответ № Нет, потому что он не переупаковывает извлеченный файл.

Таким образом, файлы данных могут быть такими файлами, как изображения или звуковые файлы или даже файлы базы данных, которые программа не будет изменять.

Вы не должны включать файл базы данных внутри связанного exe. Вместо этого создайте папку во время выполнения внутри AppData по имени вашего приложения и сохраните там свой файл базы данных.

Пример для приложения с использованием sqlite3.

dir_path = os.path.join(os.environ['APPDATA'], 'YOUR_APP_NAME')
if not os.path.exists(dir_path):
     os.makedirs(dir_path)
file_path = os.path.join(dir_path, 'your_database_file.sqlite')
sqlite3.connect(file_path)

Это создаст папку по имени вашего приложения в каталоге AppData\roaming и файл базы данных будет храниться там.

3
ответ дан Akshay 21 August 2018 в 00:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: