2013-04-23 4 views
1

Я пытаюсь использовать CX_Freeze приложение для платформы Linux. Установщик Windows MSI работает отлично, но контр-часть Linux не работает так, как я ее хочу.Замораживание общих объектов cx_freeze в Linux

При сборке пакета он отлично работает на исходной системе, но при портировании в другую систему (хотя и в той же архитектуре) он генерирует segfault. Первое, что я сделал, это проверить библиотеки, и есть некоторые огромные различия версий с libc, pthread и libdl. Поэтому я решил включить их в сборке, например, так:

if windows_build: 
    build_exe_options['packages'].append("win32net") 
    build_exe_options['packages'].append("win32security") 
    build_exe_options['packages'].append("win32con") 
    pywintypes_dll = 'pywintypes{0}{1}.dll'.format(*sys.version_info[0:2])  # e.g. pywintypes27.dll 
    build_exe_options['include_files'].append((os.path.join(GetSystemDirectory(), pywintypes_dll), pywintypes_dll)) 
else: 
    build_exe_options['packages'].append("subprocess") 
    build_exe_options['packages'].append("encodings") 
    arch_lib_path = ("/lib/%s-linux-gnu" % os.uname()[4]) 
    shared_objects = ["libc.so.6", "libpthread.so.0", "libz.so.1", "libdl.so.2", "libutil.so.1", "libm.so.6", "libgcc_s.so.1", "ld-linux-x86-64.so.2"] 
    lib_paths = ["/lib", arch_lib_path, "/lib64"] 
    for so in shared_objects: 
     for lib in lib_paths: 
      lib_path = "%s/%s" % (lib, so) 
      if os.path.isfile(lib_path): 
       build_exe_options['include_files'].append((lib_path, so)) 
       break 

После проверки оригинального cx_frozen бен это кажется динамические библиотеки играют там роль и перехват вызовов отлично. Хотя теперь я нахожусь в той части, где pthread segfaults из-за того, что он пытается использовать системы libc вместо моих (проверяется с помощью ldd и gdb).

Мой вопрос довольно прост, этот метод, который я пытаюсь, ужасен, так как он не регрессирует с рекурсивным решением. Поэтому мой вопрос: «Каков лучший способ сделать это?» Или мне нужно написать рекурсивное решение в моем установщике? »

И для того, чтобы победить Решение: «Вместо этого используйте собственный Python», у нас есть некоторые аппаратные устройства (думаю, 2 ~ 4U) с Linux (и доступ Bash), где мы также хотим запустить это. портирование всего python (с его динамическими ссылками и т. д.) выглядело как способ много работать, когда мы можем cx_freeze его и отправить библиотеки.

+0

Я хотел бы отметить, что я прочитал [link] (http://hackerboss.com/how-to-distribute-commercial-python-applications/) – Stolas

ответ

1

Я не знаю о других ваших проблемах, но грузить libc.so.6 к другой системе, как вы делаете это не могу работать, как объяснено here.

+0

D'oh, конечно же! Спасибо за память. Chroot может сделать трюк! – Stolas

+0

Хотя это не решает проблему, я решил принять это как ответ :) – Stolas

Смежные вопросы