Linux’ta dosya uzantılarının önemli olmadığını biliyorsunuzdur; yani uzantıyı “exe” yapmak iki platform için de çare olabilir.
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')
Doğru, bazı durumlarda istenmeyen sonuçlar oluşabilir. Neyse ki hemen çözümü bulmuşsunuz.
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.
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?
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.
Ş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.)