Python programınızı platformlararası olacak şekilde derlemek

Evet, hatta baska bir baslikta bizzat ben belirtmistim :​)

Ama benim merak ettigim dosyanin icerigi. Iki platformun da calistirmayi denemesinden ziyade, ikisinin de calistirabildigi formatin ne oldugunu merak ediyorum :​)

Windows son baktigimda (15 sene kadar once) NE ve PE destekliyordu. Linux’ta binfmt mekanizmasini saymazsak bir tek elf ve #! script’lerini biliyorum. (Simdi baktim, a.out varmis ve #! binfmt'la oluyormus—ama ikincisi POSIX standardi.)

Bi de COM ve BAT var…

COM dosyalari dogrudan x86 assembly kodu oldugu icin baya bir esneklik var —sadece ASCII yazi karakterlerinden olusan COM programi yazdigimi hatirliyorum— #!/'in filan hangi opcode’lara denk geldigine bakasim var ama tutuyorum kendimi :​).

compile.py’de sorun var. sys.argv[1].replace('c', '') kodu dosya adındaki bütün c harflerini siliyor.

çözümü:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os
import sys

if len(sys.argv) == 2:
    os.system(
        f"cython3 {sys.argv[1]} --embed &"
        f"gcc -Os -I /usr/include/python3.6m -o "
        f"{sys.argv[1].rstrip('.py')} "
        f"{sys.argv[1].rstrip('py') + 'c'} "
        f"-lpython3.6m -lpthread -lm -lutil -ldl"
    )
    os.remove(sys.argv[1].rstrip('py')+'c')
1 Beğeni

Doğru, bazı durumlarda istenmeyen sonuçlar oluşabilir. :slight_smile: Neyse ki hemen çözümü bulmuşsunuz.

1 Beğeni

Böyle küçük hatalara günlerimi harcadığımı bilirim ben… Günler geçtikçe insanın hataları hızlı görme kapasitesi artıyor.

1 Beğeni

Windows’un 64 bit mimarisinde mingw-w64 kullanarak py dosyalarını derlemek için şu yolu izleyebilirsiniz:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os
import sys

if len(sys.argv) == 2:
    py = sys.argv[1]
    c = py.rstrip('py') + 'c'
    exe = py.rstrip('py') + 'exe'
    os.system(
        f"cython --embed -o {c} {py} &"
        f"gcc -municode -DMS_WIN64 -mthreads "
        f"-Wall -O -IC:\Python37\include "
        f"-LC:\Python37\libs {c} -lpython37 -o {exe}"
    )

Bilgisayarda Python yüklüyken çalışan test.exe dosyası, bilgisayardan Python’ı kaldırdıktan sonra şöyle bir hata vermeye başladı.


Demek ki bir üst mesajda gösterilen yöntemle oluşturulan exe dosyaları ancak bilgisayarda Python yüklü olduğu sürece çalışıyor. Veya daha başka bir yöntem izlemek gerek.

Programı derlemek yerine yanında bir de python yorumlayıcısı yollamak daha kolay olmaz mı? En azından blender öyle yapıyor.

Python yorumlayıcısını nasıl yollayabiliriz? Yani 250 MB’lık Python klasörünü yollamaktan mı bahsediyorsunuz?

Ben onu windows’ta 30 MB diye hatırlıyorum, lib/site-packages 'i saymayın.

Python klasör olarak taşımak yerine neden uygulamaya dahil etmiyorsunuz?

https://docs.python.org/3/extending/embedding.html

Acaba nasıl yapılacağı konusunda yardımcı olabilir misiniz?

Bahsettiğim blender 80 MB’lık.

Daha önce böyle bir çalışma yapmadım. Ancak dediğim gibi eğer C ile program geliştirecekseniz ve Python’u kullanmak istiyorsanız bunu yapmanın en sağlıklı yolu budur diye düşünüyorum.

Windows’da Python’i statik derlemek pek kolay degilmis. DLL’i EXE’yle beraber yollayin?

Ayni sorun; yine statik runtime gerekecek.

Dll bu sorunu çözüyor mu? Yani bağımlılık olmadan sadece dll dosyası ile?

Sorun zaten DLL’in bulunamamasi degil mi? Yukaridaki “python37.dll eksik” hata mesajina istinaden konusuyorum.

DLL dosyasina bagimlilik ile.

1 Beğeni

Şunu sormak istiyorum. Dll ile beraber baska bir sey dağıtmak gerekmiyor mu? Mesela standart kütüphaneler. Bu konuyla ilgili örnek içeren link paylaşabilir misiniz acaba?

Ben genel executable calistirmadan bahsediyorum. Gereken kutuphaneler import section’inda yazar. DLL’lerin de import section’lari vardir.

Spesifik olarak Python’in DLL’i nasil calisiyor, ne istiyor bilmiyorum. Yukarida alinan hata Windows hatasi, cozumu DLL’i EXE’nin yanina veya PATH’e koymak.


Link olarak; statik kutuphane nereden bulunur ona baktim, 2-3 cevap “Windows’da cok zor”, bir tanesi ise “su oyun motorumda submodule olarak yer alan bir proje Python’i Windows’ta compile ediyor, onu kullanin isterseniz” gibi bir sey diyordu, cok kurcalamadim.

Geriye kalan bilgiler senin yolladigin linkte var zaten. (Compile/link asamalari nasil calisiyor, executable loader ne yapiyor yan bilgileriyle.)

Tek DLL’in yetmeyecegi bilgisi de ordaymis :\

It is not necessarily trivial to find the right flags to pass to your compiler (and linker) in order to embed the Python interpreter into your application, particularly because Python needs to load library modules implemented as C dynamic extensions ( .so files) linked against it.

Bir suru standart kutuphane modulleri dinamik formatta:

/usr/lib/python3.6/lib-dynload/_curses.cpython-36m-x86_64-linux-gnu.so
/usr/lib/python3.6/lib-dynload/_lzma.cpython-36m-x86_64-linux-gnu.so
/usr/lib/python3.6/lib-dynload/resource.cpython-36m-x86_64-linux-gnu.so
/usr/lib/python3.6/lib-dynload/readline.cpython-36m-x86_64-linux-gnu.so
/usr/lib/python3.6/lib-dynload/_asyncio.cpython-36m-x86_64-linux-gnu.so
/usr/lib/python3.6/lib-dynload/_decimal.cpython-36m-x86_64-linux-gnu.so
/usr/lib/python3.6/lib-dynload/_opcode.cpython-36m-x86_64-linux-gnu.so
/usr/lib/python3.6/lib-dynload/_testbuffer.cpython-36m-x86_64-linux-gnu.so
/usr/lib/python3.6/lib-dynload/nis.cpython-36m-x86_64-linux-gnu.so
/usr/lib/python3.6/lib-dynload/termios.cpython-36m-x86_64-linux-gnu.so
/usr/lib/python3.6/lib-dynload/_ssl.cpython-36m-x86_64-linux-gnu.so
/usr/lib/python3.6/lib-dynload/_codecs_hk.cpython-36m-x86_64-linux-gnu.so
/usr/lib/python3.6/lib-dynload/_testmultiphase.cpython-36m-x86_64-linux-gnu.so
/usr/lib/python3.6/lib-dynload/audioop.cpython-36m-x86_64-linux-gnu.so
/usr/lib/python3.6/lib-dynload/_json.cpython-36m-x86_64-linux-gnu.so
/usr/lib/python3.6/lib-dynload/_codecs_kr.cpython-36m-x86_64-linux-gnu.so
/usr/lib/python3.6/lib-dynload/_codecs_tw.cpython-36m-x86_64-linux-gnu.so
/usr/lib/python3.6/lib-dynload/xxlimited.cpython-36m-x86_64-linux-gnu.so
/usr/lib/python3.6/lib-dynload/parser.cpython-36m-x86_64-linux-gnu.so
/usr/lib/python3.6/lib-dynload/_multibytecodec.cpython-36m-x86_64-linux-gnu.so
/usr/lib/python3.6/lib-dynload/_multiprocessing.cpython-36m-x86_64-linux-gnu.so
/usr/lib/python3.6/lib-dynload/_testcapi.cpython-36m-x86_64-linux-gnu.so
/usr/lib/python3.6/lib-dynload/_gdbm.cpython-36m-x86_64-linux-gnu.so
/usr/lib/python3.6/lib-dynload/_dbm.cpython-36m-x86_64-linux-gnu.so
/usr/lib/python3.6/lib-dynload/_bz2.cpython-36m-x86_64-linux-gnu.so
/usr/lib/python3.6/lib-dynload/_curses_panel.cpython-36m-x86_64-linux-gnu.so
/usr/lib/python3.6/lib-dynload/_ctypes.cpython-36m-x86_64-linux-gnu.so
/usr/lib/python3.6/lib-dynload/_codecs_iso2022.cpython-36m-x86_64-linux-gnu.so
/usr/lib/python3.6/lib-dynload/_ctypes_test.cpython-36m-x86_64-linux-gnu.so
/usr/lib/python3.6/lib-dynload/_crypt.cpython-36m-x86_64-linux-gnu.so
/usr/lib/python3.6/lib-dynload/_sqlite3.cpython-36m-x86_64-linux-gnu.so
/usr/lib/python3.6/lib-dynload/_codecs_cn.cpython-36m-x86_64-linux-gnu.so
/usr/lib/python3.6/lib-dynload/_lsprof.cpython-36m-x86_64-linux-gnu.so
/usr/lib/python3.6/lib-dynload/_csv.cpython-36m-x86_64-linux-gnu.so
/usr/lib/python3.6/lib-dynload/_codecs_jp.cpython-36m-x86_64-linux-gnu.so
/usr/lib/python3.6/lib-dynload/_testimportmultiple.cpython-36m-x86_64-linux-gnu.so
/usr/lib/python3.6/lib-dynload/_tkinter.cpython-36m-x86_64-linux-gnu.so
/usr/lib/python3.6/lib-dynload/ossaudiodev.cpython-36m-x86_64-linux-gnu.so
/usr/lib/python3.6/lib-dynload/mmap.cpython-36m-x86_64-linux-gnu.so
/usr/lib/python3.6/lib-dynload/_hashlib.cpython-36m-x86_64-linux-gnu.so
1 Beğeni