Невозможно использовать .exe, замороженный с помощью cx_Freeze, на другом компьютере со следующей ошибкой, связанной с rpy2 - PullRequest
0 голосов
/ 01 июля 2019

Я создал небольшую программу с rpy2 для импорта R в Python и упаковал ее с помощью cx_Freeze. Затем я проверил его на своем ПК для разработки. Это работает хорошо. Однако, как только я копирую свой .exe на другой ПК с аналогичной ОС (Windows 10), с тем же Python (3.7) и R версии (3.5.2), выскакивает следующее сообщение об ошибке:

Traceback(most recent call last):
File "D:\software\Python3.7.3\lib\site- 
packages\cx_Freeze\initscripts\__startup__.py",line 14, in run
File "D:\software\Python3.7.3\lib\site- 
packages\cx_Freeze\initscripts\Console.py",line 26, in run
File "TR_SNP.py", line 32, in <module>
File "D:\plot.py",line 23, in <module>
dplR = importr('dplR')
File "D:\software\Python3.7.3\lib\site-packages\rpy2\robjects\packages.py",line 453,in importr
rpy2.rinterface.RRuntimeError

Кажется, что-то не так с импортом R lib.

Я пытался найти ответ. Вот один, который, я думаю, будет похож на мою проблему: rpy2 хорошо работает в PyCharm и не работает в .exe файле

Тем не менее, этот ответ не дает подробностей, например, где я должен поставить библиотеки.

1 Ответ

0 голосов
/ 02 июля 2019

Замороженное приложение, вероятно, не ищет установку R в нужном месте на целевом ПК.Попробуйте добавить следующие строки в ваше основное приложение:

import platform
import rpy2.situation
lib_path = rpy2.situation.get_rlib_path(r_home, platform.system())
print(lib_path)

Это покажет местоположение, где приложение ищет R lib.Этот путь (и, вероятно, весь r_home) должен существовать на целевом ПК и содержать совместимую установку R.

Если путь неправильный, вам нужно сообщить замороженному приложению, где находится установка R на целевом устройстве.машина использует что-то вроде

import os
os.environ['R_HOME'] = path_to_r_home_on_target_machine

Но это будет сложно, так как вы вообще не будете знать, где находится установка R.Вы можете попробовать добавить следующие строки в ваше приложение (не уверен, что оно работает):

import sys    
import os
import rpy2.situation
if getattr(sys, 'frozen', False):
    # The application is frozen
    # reset R_HOME and try to find a R installation using the fallback mechanisms
    del os.environ['R_HOME']
    os.environ['R_HOME'] = rpy2.situation.get_r_home()
...