Почему, когда я запускаю A.exe, который вызывает B.exe, происходит сбой, потому что B.exe пытается найти свои модули в папке A.exe (вызывающая сторона) вместо папки B.exe (называемой)? - PullRequest
0 голосов
/ 07 февраля 2019

Когда я запускаю B.exe (расположенный в c: /my_software/FOLDER_B/B.exe) из A.exe (расположенный в c: /my_software/FOLDER_A/A.exe), оба построены с использованием cx_Freeze, B.exe(вызываемый) пытается найти свои модули (например, IMAGE_B.png) в папке A.exe (вызывающая сторона), когда ему необходимо выполнить поиск в папке B.exe.Я думаю, что это происходит из-за неправильного кода в setup.py из cx_Freeze.

Я использую в своем скрипте функцию os.getcwd () для получения корневого пути в каждом .exe

Это мой setup.py, который я использовал для сборки обоих .exe (Aи Б)

import os
from cx_Freeze import setup, Executable
import sys

os.environ['TCL_LIBRARY'] = r'c:\python\tcl\tcl8.6'
os.environ['TK_LIBRARY'] = r'c:\python\tcl\tk8.6'

buildOptions = dict(packages = ["tkinter","os"], 
                    excludes = [], 
                    include_files [r'c:\python\DLLs\tcl86t.dll', 
                                   r'c:\python\DLLs\tk86t.dll', 
                                  'A.png','icono.ico'])

executables = [Executable('A.py', 
                          base="Console", 
                          icon = "icono.ico")]

setup(name='A',version = '1',
     description = 'program A', 
     options = dict(build_exe = buildOptions), 
               executables = executables)

1 Ответ

0 голосов
/ 07 февраля 2019

См. В документации cx_Freeze , как использовать файлы данных .Он предоставляет следующий пример кода:

def find_data_file(filename):
    if getattr(sys, 'frozen', False):
        # The application is frozen
        datadir = os.path.dirname(sys.executable)
    else:
        # The application is not frozen
        # Change this bit to match where you store your data files:
        datadir = os.path.dirname(__file__)

    return os.path.join(datadir, filename)

Также обратите внимание, что cx_Freeze версия 5.1.1 (текущая версия) замораживает пакеты в подкаталоге lib каталога сборки, в то время как основной скриптсам будет заморожен в самом каталоге сборки.Возможно, вам придется изменить приведенный выше пример кода соответственно.

...