Skip to content

python kodlarını çalıştırılabilir (.exe) dosya yapmak

pythonda çalışmanın dezavantajlarından bir tanesi yazdığınız kodları işletim sisteminde çalıştırabilir dosya haline getirme konusudur. çok fazla tercih etmesemde bazen gerekebiliyor.. bu noktada birden fazla seçenek mevcut ancak genel olarak en popüler olanları kullanmak daha fazla kütüphane v.b. konuda soun yaşamamanızı sağlıyor.

pyinstaller seçeneklerin en popüleri diye biliriz. tabiki ilk önce kurmamız gerekiyor.

pip install pyinstaller

kurulumu tamamladıktan sonra kullanımı oldukça kolay. komut yorumluyacısında ihtiyacımız olan parametreleri girerek exe dosyasını oluşturuyoruz.

pyinstaller --onefile dosyaadi.py

komut tamamlandığından python dosyasının bulunduğu klasör içine dist ve build isimli iki yeni klasör oluştuğunu göreceksiniz. dist klasöründen exe dosyanız build klasöründen ise exe oluşturma sürecinde kullanılan dosyalar yer almaktadır.

yukarıdaki komut yapısını kullandığınızda yazdığınız kod ihtiyaç duyulan tüm sistem dosyalarını tek bir dosya içine dahil etmektedir. bu nedenden dolayı dist klasöründeki exe dosyasına incelediğinizde yazdığımız üç beş satır koda karşı oldukça büyük boyutlu olduğunuz göreceksiniz.

eğer gui şeklinde bir uygulama yaptızsanız programı çalıştırdığınız ilave bir console pencesi açılmaması adına noconsole parametresinin eklenmesi gerekmektedir.

pyinstaller --onefile --noconsole dosyaadi.py

oluşturlan dosyanın iconunu değiştirme gibi bir çok seçenek için https://pyinstaller.org/ adresi incelemenizi öneririm.

pythonda dosya içeriği karşılaştırma

iki text dosya içeriği arasındaki farkları bulmak için temel olarak dosyaları satır satır olarak okuyup satıları karşılaştırmak gerekmektedir. bu işlemi kod olarak basitleştirme adına python kullanabilieceğiniz bir çok kütüphane bulunmaktadır. bunlardan en kullanışlarıdan bir tanesi difflib dir.

aşagıdaki örnekte importlardan sonra dosyaların içeriğindeki satırları bir diziye atadıktan sonra difflib de dizi girişlerini ve istediğimiz çıktıyı tanımlarıyoruz..

import difflib
from pathlib import Path

first_file_lines = Path('fileA.txt').read_text().splitlines()
second_file_lines = Path('fileB.txt').read_text().splitlines()

html_out = difflib.HtmlDiff().make_file(first_file_lines, second_file_lines)
Path('diff_output.html').write_text(html_out)
fileA.txtfileB.txt
first_file_lines = Path(‘fileA.txt’)
second_file_lines = Path(‘fileB.txt’)
first_file_lines = Path(‘fileA.txt’)
second_file_lines = Path(‘file2.txt’).read_text()

diff_output.html aşagıdaki şekilde görülecektir.

python örnekleri : hafıza kullanım bilgileri

Python’da kullanılabilir hafıza bilgisini öğrenmek için psutil adlı bir modül kullanabilirsiniz. Bu modül, sistem hafıza bilgisi gibi çeşitli sistem verilerine erişmenize izin verir. Örnek olarak, aşağıdaki kod parçacığı hafıza kullanım bilgisini gösterir:

import psutil

memory = psutil.virtual_memory()

print(f"Hafıza kullanım oranı: {memory.percent}%")

print(f"Kullanılabilir hafıza: {memory.available // (1024 ** 2)} MB")

Bu kod, hafıza kullanım oranını yüzdesini ve kullanabilir hafızayı MB cinsinden ekrana yazdıracaktır. psutil modülünü kullanmadan önce sisteminize yüklemeniz gerekebilir. Bunun için aşağıdaki komutu kullanabilirsiniz:

pip install psutil

python örnekleri : cpu sayısı

Python’da bir sistemdeki CPU sayısını öğrenmek için multiprocessing modülünü kullanabilirsiniz. Örnek kod aşağıdaki gibidir:

import multiprocessing

# Sistemdeki CPU sayısını alın
cpu_count = multiprocessing.cpu_count()

print(f"CPU sayısı: {cpu_count}")

pip 3 de kurulum sırasında –no-warn-script-location uyarısı

linuxde pip ile paket yüklemek istediğinizde aşagıdaki hatayı alırsanız

  WARNING: The script flask is installed in '/home/<username>/.local/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.

kabuk yorumlayıcı olarak bash kullandığınızı düşünerek

vi ~/.bashrc

ile bash konfigürasyon dosyasını açarak dosya içerisine

export PATH=$PATH:/home/$USER/.local/bin

satırını eklemek çözüm olacaktır.

python – faktoriyel hesabı

programlama dilleri ögrenilirken en fazla yapılan matematiksel işlemlerden bir tanesidir faktoriyel hesabıdır

n! = n * (n-1)!

faktoriyel formülü

def faktoriyel(n):
  if(n==1):
    return n
  else:
    return n*(faktoriyel(n-1))

sayi = int(input("Faktoriyel Hesabı Yapılacak Sayı : "))

if sayi < 0:
  print("Negagif Sayı girişi yaptınız")
elif sayi == 0:
  print("Faktoriyel : 1")
else:
  print("Faktoriyel : ",faktoriyel(sayi ))

sqlite veritabanına verilerin kaydedilmesi ve flask frameworkunda bu verilerin mathplotlib ile grafiklerinin çizim örneği

öncelikle proje klasörümü ve kullanacağımız virtualenv yi oluşturulalım

fcicek@ferhatcicek:~$ mkdir system_usage

fcicek@ferhatcicek:~$ mkdir system_usage
fcicek@ferhatcicek:~$ cd system_usage/
fcicek@ferhatcicek:~/system_usage$ python -m venv env

projemizde sistem verilerini saklamak iin sqlite veritabanını kullancağız. kullanacağımız system_usage veritababı oluşturalım

fcicek@ferhatcicek:~/system_usage$ sqlite3 system_usage.db
sqlite> .quit

veritabanı dosyamızı oluşturduktan sonra sıra tablomuzu oluşturmaya geldi. bunu sql ortamında yapabiliriz ancak bu örnekte python ile oluşturacağız..

fcicek@ferhatcicek:~/system_usage$ nano sqlite_db_create.py

aynı isimli tablo varsa sileceğiz ve veri tabanımızla aynı isimli bir tablo oluşturacağız. örneğimizi basit tutmak adına anlık cpu ve hafıza verilerini tablomuzda tutacağımız için tablomuzda bu veriler için gerekli alanları oluşturacağız…

import sqlite3 as lite
import sys
con = lite.connect('system_usage.db')
with con: 
    cur = con.cursor() 
    cur.execute("DROP TABLE IF EXISTS system_usage")
    cur.execute("CREATE TABLE system_usage(timestamp DATETIME, cpu NUMERIC, mem NUMERIC)")

kodumuz yazık şimdi virtualenv i aktif ederek kodumu çalıştıralım…

fcicek@ferhatcicek:~/system_usage$ source env/bin/activate
(env) fcicek@ferhatcicek:~/system_usage$ python sqlite_db_create.py 

python kodumuz sonucu kontrol etmek istersek. clidan veritabanına bakıp tablonun durumunu inceleyebiliriz.

(env) fcicek@ferhatcicek:~/system_usage$ sqlite3 system_usage.db 
SQLite version 3.31.1 2020-01-27 19:55:54
Enter ".help" for usage hints.
sqlite> .table
system_usage
sqlite> .quit

örneğimizde cpu ve hafıza verilerini saklayacağız. bunun için pythonde psutil paketini kullanacağız. psutil paketini yükleyelim

(env) fcicek@ferhatcicek:~/system_usage$ pip install psutil

psutil paketini daha önce kullanmamış olabilirsiniz.. programımızda kullanacağımız verileri içerecek basit bir uygulama yapalım.

import psutil

print('MEM  % used:', psutil.virtual_memory()[2])
print('CPU % used:', psutil.cpu_percent(2))

programi çalıştıralım.

(env) fcicek@ferhatcicek:~/system_usage$ python psutil_system.py 
MEM  % used: 86.5
CPU % used: 2.0

anlık olarak cpu ve hazfıza kullanım bilgileriniz artık alabiliyoruz. bu bilgilerini şimdi de veritabanımıza ekleyelim.

bunun için program tarafımızdan sonlandırılana kadar 60 saniyede bir cpu ve hazfıza kullanım değerini okuyarak sqlite veritabanına ekleyecek basit bir kod yazalım.

(env) fcicek@ferhatcicek:~/system_usage$ nano data_logger.py     
import time
import sqlite3
import psutil

dbname='system_usage.db'

ornekleme_zamani = 60

def sistem_bilgisi_oku():
    mem = psutil.virtual_memory()[2]
    cpu = psutil.cpu_percent(1)
    if mem is not None and cpu is not None:
        return cpu,mem

def veritabani_ekle (cpu, mem):
    conn=sqlite3.connect(dbname)
    curs=conn.cursor()
    curs.execute("INSERT INTO system_usage values(datetime('now'), (?), (?))", (cpu, mem))
    conn.commit()
    conn.close()

def main():
    while True:
        cpu, mem = sistem_bilgisi_oku()
        veritabani_ekle (cpu, mem)
        time.sleep(ornekleme_zamani)

main()

artık verilerimizi bir veri tabanında turuyoruz. şimdi bunu web üzerinden bağlantı yapacak kullanıcılar için görselleştirelim. bunun için flask frameworkunu kullancağız. virtualenv altına flask ve ilişkili paketleri yükleyelim.

(env) fcicek@ferhatcicek:~/system_usage$ pip install flask

kullanıcı browser kullanarak sayfamıza bağlandığında, veritabanındaki en son cpu ve hafıza kullanım verisini sorgulayarak bu veriyi ekrana yazdıralım.

(env) fcicek@ferhatcicek:~/system_usage$ nano son_olcum.py
from flask import Flask, render_template, request
app = Flask(__name__)
import sqlite3

def getData():
	conn=sqlite3.connect('system_usage.db')
	curs=conn.cursor()
	for row in curs.execute("SELECT * FROM system_usage ORDER BY timestamp DESC LIMIT 1"):
		time = str(row[0])
		cpu = row[1]
		mem = row[2]
        print(str(cpu))
        print((str(mem))
	conn.close()
	return time, cpu, mem

@app.route("/")
def index():	
	time, cpu, mem = getData()
	templateData = {
		'time': time,
		'cpu': cpu,
		'mem': mem
	}
	return render_template('son_olcum.html', **templateData)
    
if __name__ == "__main__":
   app.run(host='0.0.0.0', port=5000, debug=True)

flask frameworkun tema yapısını kullanacağımız için templates dizinini oluşturup içinde gerekli dosyaları oluşturmamız gerekmektedir. python dosyamızda ilişkilendirilen tema dosyası son_olcum.html veiçerisinde kullanılacak verinin templateData olarak belirtildi.

(env) fcicek@ferhatcicek:~/system_usage$ mkdir templates
(env) fcicek@ferhatcicek:~/system_usage$ cd templates
(env) fcicek@ferhatcicek:~/system_usage/templates$ nano son_olcum.html
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">    
<title>System Durum</title>

<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">

<!-- Optional theme -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous">

<!-- Latest compiled and minified JavaScript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>

</head>

<body>

<div class="container-fluid">
    <div class="jumbotron">
        <p class="lead">Son veri okuma  :  {{ time }}   <a href="/"class="button">Güncelle</a></p>     
        <hr class="my-4">
        <p class="lead">CPU Kullanım Oranı  % : {{ cpu }}</p>    
        <p class="lead">Memory Kullanım Oranı  % : {{ mem }} </p>   
        <hr class="my-4">
    </div>        
</div>

</body>
</html>

şimdi kodumuzu test edelim.

(env) fcicek@ferhatcicek:~/system_usage$ nano son_olcum.py

tarayıcımız ile http://sunucuip:5000 adresine bağlandığımız aşagıdaline benzer bir ekran ile karşılaşmamız gerekecek…

kodumuz biraz daha geliştirmenin zamanı geldi. cpu ve hafıza verilerini veritabanımızda tuttugumuz için bu veriyi bir grafik olarka ekrana yansıtabiliriz. bu işlem sırasında mathplotlib paketinde faydalanacağımız için öncelikle kurulumunu yapalım.

(env) fcicek@ferhatcicek:~/system_usage$ pip install matplotlib

şimdi kodumuza yapacağımız ilave , belirtilen örnekleme sayısınca veri tabanından veri çekip bunu grafiği oluşturup son kullanıcıya ileteceğiz. cpu ve hafiza grafiklerini çizdirmek için app.route metodundan faydalanacağız.

from flask.globals import session
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from matplotlib.figure import Figure
import io

from flask import Flask, render_template, send_file, make_response, request
app = Flask(__name__)

import sqlite3

def sonKayit():
        conn=sqlite3.connect('system_usage.db')
        curs=conn.cursor()
        for row in curs.execute("SELECT * FROM system_usage ORDER BY timestamp DESC LIMIT 1"):
                time = str(row[0])
                cpu = row[1]
                mem = row[2]
        conn.close()
        return time, cpu, mem

def sonKayitDizi (orneklemeSayisi):
        conn=sqlite3.connect('system_usage.db')
        curs=conn.cursor()
        curs.execute("SELECT * FROM system_usage ORDER BY timestamp DESC LIMIT "+str(orneklemeSayisi))
        data = curs.fetchall()
        tarihDizi = []
        cpuDizi = []
        hafizaDizi = []
        for row in reversed(data):
                tarihDizi.append(row[0])
                cpuDizi.append(row[1])
                hafizaDizi.append(row[2])
        conn.close()
        return tarihDizi, cpuDizi, hafizaDizi
    
def maksimumKayit():
        conn=sqlite3.connect('system_usage.db')
        curs=conn.cursor()
        for row in curs.execute("select COUNT(cpu) from  system_usage"):
                maksimumKayitDizi=row[0]    
        conn.close()
        return maksimumKayitDizi


global orneklemeSayisi
orneklemeSayisi = maksimumKayit()
if (orneklemeSayisi > 101):
    orneklemeSayisi = 100

@app.route("/")
def index():
        time, cpu, mem = sonKayit()
        templateData = {'time':time,'cpu':cpu,'mem':mem,'orneklemeSayisi':orneklemeSayisi}
        return render_template('index.html', **templateData)
    
@app.route('/', methods=['POST'])
def post_form():
        global orneklemeSayisi
        orneklemeSayisi = int (request.form['orneklemeSayisi'])
        numMaxSamples = maksimumKayit()
        if (orneklemeSayisi > numMaxSamples):
                orneklemeSayisi = (numMaxSamples-1)
        time, cpu, mem = sonKayit()
        templateData = {'time':time,'cpu':cpu,'mem':mem,'orneklemeSayisi':orneklemeSayisi}
        return render_template('index.html', **templateData)
    
@app.route('/plot/cpu')
def cpu_cizim():
        times, cpuDizi, hafizaDizi = sonKayitDizi(orneklemeSayisi)
        ys = cpuDizi
        fig = Figure()
        axis = fig.add_subplot(1, 1, 1)
        axis.set_title("CPU [%]")
        axis.set_xlabel("Örnekleme")
        axis.grid(True)
        xs = range(orneklemeSayisi)
        axis.plot(xs, ys)
        canvas = FigureCanvas(fig)
        output = io.BytesIO()
        canvas.print_png(output)
        response = make_response(output.getvalue())
        response.mimetype = 'image/png'
        return response
    
@app.route('/plot/mem')
def hafiza_cizim():
        times, cpuDizi, hafizaDizi = sonKayitDizi(orneklemeSayisi)
        ys = hafizaDizi
        fig = Figure()
        axis = fig.add_subplot(1, 1, 1)
        axis.set_title("MEM [%]")
        axis.set_xlabel("Örnekleme")
        axis.grid(True)
        xs = range(orneklemeSayisi)
        axis.plot(xs, ys)
        canvas = FigureCanvas(fig)
        output = io.BytesIO()
        canvas.print_png(output)
        response = make_response(output.getvalue())
        response.mimetype = 'image/png'
        return response

    
if __name__ == "__main__":
   app.run(host='0.0.0.0', port=5000, debug=True)
<!-- index.html -->
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>System Durum</title>

<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">

<!-- Optional theme -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous">

<!-- Latest compiled and minified JavaScript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>

</head>

<body>

<div class="container-fluid" align=center>
    <div class="jumbotron">
        <p class="lead"><a href="/"class="button">Güncelle</a></p>                                
        <hr class="my-4">
        <p class="lead">Son veri okuma  :  {{ time }}   </p>
        <hr class="my-4">
        <p class="lead">CPU Kullanım Oranı  % :<b> {{ cpu }} </b></p>
        <p class="lead">Memory Kullanım Oranı  %<b> : {{ mem }} </b></p>
        <hr class="my-4">
    </div>
</div>
<div class="container-fluid" align=center>

        <form method="POST">
                <input name="numSamples" value= {{orneklemeSayisi}}>
                <input type="submit">
                </form></p>
        <hr>
        <img src="/plot/cpu"  width="80%" height=400>
        <img src="/plot/mem"  width="80%" height=400>

</div>
</body>
</html>

kodumuzu aşagıdaki şekilde günceller ve çalıştırırsak aşagıdaki gibi ekran görüntüsüne sahip olacağız

python projelerinde gerekli modül / paketler

python projelerinde, projenin sorunsuz olarak çalışması için ihtiyaç duyulan paketler ana dizinde genel olarak requirements.txt dosyası içinde belirtilir.

dosya içerinde her satırda ihtiyaç duyulan modül adı ve sürüm numarası yer almaktadır.

Jinja2==3.0.1
requests==2.25.1

paketlerin sürümlerinde farklılık olabiliceği için yeni ve eski sürümlerde uygulama düzgün şekilde çalışmayabilir… bunun için paket sürüm ihtiyaçlarını belirtmek için ==, >=, <= operaatörleri kullanılabilir.

geliştirme ortamınızda en doğru paket ve versiyonlarını dosyaya aktarmak için pip paket yöneticisini kullanıyorsak

pip freeze > requirements.txt

komutu kullanılabilir. temin edilmiş herhangi bir projedeki en uygun paket kurmak içinde

pip install -r requirements.txt

kullanablirsiniz.

filebrowser

browsespy yazısı sonrası daha güzel kullanışlı bir dosya yöneticisi önerisi istenler oldu. daha gelişmiş bir dısya yönetici için go tabalı filebrowser incelenebilir. kurulum için

curl -fsSL https://raw.githubusercontent.com/filebrowser/get/master/get.sh | bash

ve çalıştırmak için

filebrowser -a 0.0.0.0 -p 8080 -r $HOME

yeterli olacaktır.

proje sitesi : filebrowser.org

Back To Top