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

Hepinize merhaba;
Ben, windows’ tan sıkılıp Ubuntu kurdum. Ancak Windows oldukça popüler bir işletim sistemi ve yazdığım programları başkalarına vermem gerektiğinde .exe olarak derlemem gerekiyor. Ubuntu için wine diye bir program varmış ama .exe oluşturma konusunda pek istikrarlı çalışmıyormuş. Bu yüzden sizlere danışmak istedim. Python programını nasıl her platformda çalışacak şekilde derleyebilirim?

Programınızı 2 şekilde bulundurun win kullananlar için exe halini verin linux kullananlar için ise Linux da bulunan executable halini verin

1 Beğeni

Siz tam anlamadınız, diyorum ki ben bunu bir kere derleyeyim, her platformda çalışsın. Bu olmazsa da nasıl Ubuntu’da yazıp Windows için wine harici bir yöntem kullanarak .exe dosyası oluşturabilirim?

Gayet doğru anladım. Ben size öneri sundum, dosyanızı. Hem exe halinde bulundurun hem de Linux hali in executable halde bulundurun. https://stackoverflow.com/questions/2950971/cross-compiling-a-python-script-on-linux-into-a-windows-executable

Buyrun eğer bu şekilde olmazsa sanal makine kurup orada derlemenizi tavsiye ederim. Kivy için ben öyle yapıyorum (Debian kurup çalıştırıp apk haline orada getirtiyorum sonra bağlantı kurup atıyorum dosyayı) Bir kere derleyip hem ubuntu hem Windows için nasıl derlenir java haricinde böyle bir şey duymadım. Varsa bilen yazarsa benim için de iyi olur.

3 Beğeni

python py olarak her platformda çalışıyor zaten . kullanıcılar nasıl java da jar çalıştırmak için Bilgisayarlarına jre indiriyorlarsa pythonda indirsinler. linuxta default zaten yüklü geliyor.

Java için otomatik olarak yüklü geliyor. Yani kullanıcı kendisi bununla uğraşmıyor. O yüzden python için de durum böyle olmadığı sürece son kullanıcı kendisi indirmez.

Genelde şirketler programlarını dağıtırken her platform için gerekli kurulum dosyalarını ayrı ayrı sunarlar. Yani bu heryerde böyledir. Mesela şu sayfaya girdiğinizde, önce işletim sisteminizi tespit ederler ve ona göre kurulum dosyalarını indirmenizi sağlarlar. Tabi sağ taraftaki kısımdan işletim sistemi tercihini değiştirebilirsiniz.

https://netbeans.org/downloads/8.1/

Ancak ben kodumu bir kere yazıp her yerde çalıştırmak istiyorum diyorsanız, o zaman her platformda aynı programı çalıştıracak ortamın kurulu olduğunu varsaymanız gerekir ve bunu kullanıcıya belirtmeniz gerekir. “Bu programı Python kurulu olmayan bilgisayarda çalıştıramazsınız” gibi gibi.

Eğer Python programınızda ek kütüphaneler varsa kullanıcı bir de bunları kurmak için uğraşacaktır…

1 Beğeni

Aslında blender kendi python yorumlayıcısını kendi içinde indirip tüm dosyaları .py olarak çalıştırıyor. Yapılabilir ama indirmeye değecek bir program olmalı.

1 Beğeni

Bahsettiğiniz gibi bir dosya oluşturulabilir ancak içinde hem Windows ikilisini hem de UNIX ikilisini bulundurur. Hatta bunun içine Mac OS X’i de katmak gerek. Bu durumda da dosya boyutu büyür. Böyle bir şeye gerek yok. Her platform için ayrı ikililer sunun. Genelde de böyle yapılıyor zaten.

2 Beğeni

Haklısınız. Ama kullanıcılar Windows’ta Python kurduklarında idle falan da kuruluyor. Sadece yorumlayıcısı olan bir Python olsaydı güzel olurdu. py dosyası değil de pyc dosyalarını dağıtırdık java gibi olurdu.

Yazdığım programı kullanan iki kişiye de önce Python’ı indirin ve kurun dedim. İkisi de Python bilmiyor bu arada.
Py dosyasını da hem Windows’ta, hem Linux’te hem de Mac’te çalışacak şekilde yazdım. Programı kullanan kişilerden birisi mac, diğeri windows, ben de genelde Ubuntu kullanıyorum. Yazdığım program çok kişi tarafından kullanılmayacağı için, arkadaşlara Python kurmaları gerektiğini rahat rahat söyleyebiliyorum.

Sıklıkla kullandığım bir script varsa onu executable hale getirmek yerine, o betik dosyasını çalıştıran çok daha basit bir py dosyasını executable hale getiriyorum, mesela aşağıdaki dosyayı…

x.py

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

import os

os.system("python3 ~/Projects/testet/testet.py")

Yukarıdaki betik dosyasını derledikten sonra, çalıştırmak istediğim dosyayı

~$ ./testet.py

yazarak değil de,

~$ testet

yazarak çalıştırmış oluyorum. Derlenen dosya testet.py değil, ismi x.py olan, testet.py dosyasını çalıştıran bir başka dosya oluyor.

Sonra o executable dosyayı bir bin klasörüne yerleştiriyorum, py dosyası her yerden çalışır hale geliyor.

Bunu yapmaktaki amacım programı çalıştırırken biraz hızlı olmak, daha az harf yazmak.

Mesela Linux’te bir Python dosyasını derlemek istediğimizi varsayalım. Derleme işlemi için şunu yapmak gerekiyor değil mi?

~$ cython3 dosya.py --embed

sonra

~$ gcc -Os -I /usr/include/python3.6m -o dosya dosya.c -lpython3.6m -lpthread -lm -lutil -ldl

Bu işlemi tekrar tekrar yapmamak için

Şöyle bir betik dosyası oluşturuyorum:

compile.py

#!/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].replace('.py', '')} "
        f"{sys.argv[1].replace('py', 'c')} "
        f"-lpython3.6m -lpthread -lm -lutil -ldl"
    )
    os.remove(sys.argv[1].replace('py', 'c'))

Bu betik dosyası içindeki kodlar sayesinde kendisini derletebilir.

~$ compile.py compile.py

Oluşan dosyayı bin klasörüne atıyorum.

Sonra çalıştırmak istediğim dosyayı çalıştıran bir başka py dosyasını derlemek istediğimde aşağıdaki yolu izliyorum:

~$ compile x.py

Windows’ta da benzer bir yol izliyorum.

4 Beğeni

Hem standart Linux dagitimlari hem de Windows tarafindan calistirilabilen ne dosya formati var, merak ettim?

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')
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.