Python - Pyinstaller > Failed to execute script hatası

Merhaba,

pyinstaller ile paketlediğim programım çalıştırırken bu hatayı veriyor >> failed to execute script

Kodlarım;

from tkinter import *
from PIL import ImageTk, Image
from os import system
import sqlite3
from datetime import datetime
import matplotlib.pyplot as plt
from selenium import webdriver
from time import sleep

system("color a")

an = datetime.now()
gun = str(an.day)
if len(gun) == 1:
    gun = "0" + str(an.day)
ay = str(an.month)
if len(ay) == 1:
    ay = "0" + str(an.month)
yil = str(an.year)
tarih = "{}{}{}.db".format(gun, ay, yil)

con = sqlite3.connect("database/{}".format(tarih))
cursor = con.cursor()
cursor.execute("CREATE TABLE IF NOT EXISTS DATAS (X_EKSENI INT, Y_EKSENI INT)")
con.commit()
con.close()

conx = sqlite3.connect("database/all_data/tum_veriler.db")
cursorx = conx.cursor()

cursorx.execute("CREATE TABLE IF NOT EXISTS DATA (X_EKSENI INT, Y_EKSENI INT)")
conx.commit()
conx.close()

def report_one_day():

    an = datetime.now()
    gun = str(an.day)
    if len(gun) == 1:
        gun = "0" + str(an.day)
    ay = str(an.month)
    if len(ay) == 1:
        ay = "0" + str(an.month)
    yil = str(an.year)
    tarih = "{}{}{}.db".format(gun, ay, yil)

    con = sqlite3.connect("database/{}".format(tarih))
    cursor = con.cursor()

    cursor.execute("SELECT * FROM DATAS")
    con.commit()
    data = cursor.fetchall()
    con.close()

    if len(data) == 0:
        pass

    else:
            
        count = 0
        x_ekseni = list()
        y_ekseni = list()

        for i in data:

            x_ekseni.append(i[0])
            y_ekseni.append(i[1])

            plt.plot(x_ekseni, y_ekseni, color="red", lw=3, marker="o", markersize=10, markerfacecolor="black", markeredgecolor="yellow", markeredgewidth=1)
            count += 1

            if count > len(data):
                break

        plt.show()

def report_tum_veriler():

    con = sqlite3.connect("database/all_data/tum_veriler.db")
    cursor = con.cursor()

    cursor.execute("SELECT * FROM DATA")

    con.commit()
    data = cursor.fetchall()

    con.close()

    if len(data) == 0:
        pass

    else:
            
        count = 0
        x_ekseni = list()
        y_ekseni = list()

        for i in data:

            x_ekseni.append(i[0])
            y_ekseni.append(i[1])

            plt.plot(x_ekseni, y_ekseni, color="red", lw=3, marker="o", markersize=10, markerfacecolor="black",
                     markeredgecolor="yellow", markeredgewidth=1)
            count += 1

            if count > len(data):
                break

        plt.show()

def verileri_al():

    count = 0

    website = "https://borsa.doviz.com/hisseler/SASA"
    xxx = 'C:/Users/USER/Desktop/chromedriver'
    driver = webdriver.Chrome(executable_path=xxx)
    driver.get(website)

    sleep(3)

    script = "return window.Highcharts.charts[0].series[0].options.data"
    data = driver.execute_script(script)

    an = datetime.now()
    gun = str(an.day)
    if len(gun) == 1:
        gun = "0"+str(an.day)
    ay = str(an.month)
    if len(ay) == 1:
        ay = "0"+str(an.month)
    yil = str(an.year)
    tarih = "{}{}{}.db".format(gun, ay, yil)

    con = sqlite3.connect("database/{}".format(tarih))
    cursor = con.cursor()

    cursor.execute("CREATE TABLE IF NOT EXISTS DATAS (X_EKSENI INT, Y_EKSENI INT)")
    con.commit()

    conx = sqlite3.connect("database/all_data/tum_veriler.db")
    cursorx = conx.cursor()

    cursorx.execute("CREATE TABLE IF NOT EXISTS DATA (X_EKSENI INT, Y_EKSENI INT)")
    con.commit()

    the_end = len(data) - 1

    for i in data:
        aaa = data[count]["x"] * 0.0010
        xxx = datetime.fromtimestamp(aaa).strftime("%Y.%m.%d %X")
        cursor.execute("INSERT INTO DATAS VALUES (?,?)", (xxx, data[count]["y"]))
        con.commit()
        cursorx.execute("INSERT INTO DATA VALUES (?,?)", (xxx, data[count]["y"]))
        conx.commit()
        print("VERİLER KAYIT EDİLİYOR. TARİH >> {} | TUTAR >> {}".format(xxx, data[count]["y"]))
        count += 1

        if count > the_end:
            break

    sleep(0.3)
    sleep(0.3)
    con.close()
    conx.close()
    sleep(0.3)
    driver.close()


class Application(object):

    def __init__(self):

        self.main()

    def main(self):

        self.pencere1 = Tk()
        self.pencere1.geometry("960x540+510+210")
        self.pencere1.resizable(FALSE, FALSE)
        self.pencere1.title("TVHD SOFT | BORSA TAKİP | ANA EKRANI | https://tvhdsoft.com")

        self.canvas = Canvas(self.pencere1, width=960, height=540)
        self.image =ImageTk.PhotoImage(Image.open("img/bg_2.png"))
        self.canvas.create_image(0, 0, anchor=NW, image=self.image)
        self.canvas.pack()

        self.menu = Menu(self.pencere1)
        self.pencere1.config(menu=self.menu)

        self.program = Menu(self.menu, tearoff=0)
        self.menu.add_cascade(label="Program", menu=self.program)
        self.program.add_command(label="Versiyon", command=self.version)
        self.program.add_command(label="Çıkış Yap", command=self.cikis_yap)

        self.veri_cek = Menu(self.menu, tearoff=0)
        self.menu.add_cascade(label="Veri Çek", menu=self.veri_cek)
        self.veri_cek.add_command(label="Veri Çek > SASA", command=verileri_al)

        self.rapor = Menu(self.menu, tearoff=0)
        self.menu.add_cascade(label="Rapor", menu=self.rapor)
        self.rapor.add_command(label="Rapor >> 1 Günlük", command=report_one_day)
        self.rapor.add_command(label="Rapor >> Tüm Veriler", command=report_tum_veriler)

        self.yardim = Menu(self.menu, tearoff=0)
        self.menu.add_cascade(label="Yardım", menu=self.yardim)
        self.yardim.add_command(label="İletişim", command=self.yardimx)

    def cikis_yap(self):
        self.pencere1.quit()

    def version(self):

        self.pencere = Tk()
        self.pencere.title("TVHD SOFT | BORSA TAKİP | VERSİYON EKRANI | https://tvhdsoft.com")
        self.pencere.geometry("+750+300")
        self.pencere.resizable(FALSE, FALSE)

        self.etiket = Label(self.pencere, text="Aşağıdaki versiyon numarası programa aittir.",
                            font="Helvatica 18 bold")
        self.etiket.pack()

        self.etiket = Label(self.pencere, text="----------------------------------------------------------------------")
        self.etiket.pack()

        self.etiket = Label(self.pencere, text=">>>> Version 1.0.0 <<<<", font="Helvatica 14 bold", fg="dark blue")
        self.etiket.pack()

    def yardimx(self):

        self.pencere = Tk()
        self.pencere.title("TVHD SOFT | BORSA TAKİP | YARDIM EKRANI | https://tvhdsoft.com")
        self.pencere.geometry("+750+300")
        self.pencere.resizable(FALSE, FALSE)

        self.etiket = Label(self.pencere, text="Aşağıdaki iletişim adreslerini kullanabilirsiniz.",
                            font="Helvatica 18 bold")
        self.etiket.pack()

        self.etiket = Label(self.pencere, text="----------------------------------------------------------------------")
        self.etiket.pack()

        self.etiket = Label(self.pencere, text="safatevhid@gmail.com", font="Helvatica 14 bold", fg="dark blue")
        self.etiket.pack()

app = Application()
mainloop()

not > selenium modülünü chrome tarayıcısıyla kullanıyorum. driver_path değişkeni bilgisayardaki chrome dosyasının konumunu alıyor.

img klasöründe bulunması gereken dosya >>

lütfen resmi tam ekran açarak indiriniz.

aynı dizinde bulunması gereken klasör > database
database klasörünün altında olması gereken klasör > all_data

internette ve forumda bulduğum çözümleri denedim fakat olmadı :frowning: uygulamalı çözebilecek biri var mı?

Yardımcı olabilirseniz severim.

Windows açık değil şuanda o yüzden deneyemiyorum. Ancak bir önerim var bir deneyin isterseniz. Pyinstaller’ı çalıştırdıktan sonra oluşan spec dosyasını açıp, chromedriverbinaries listesine ekler misiniz? Bu binaries'in normalde boş bir liste olması lazım. a = Analysis(...)'in parametrelerinden birisidir.

Yani binaries listesinin yeni halini şöyle yapın:

a = Analysis(
    [...],
    binaries=[(r'C:\Users\USER\Desktop\chromedriver\chromedriver.exe', '.\selenium\webdriver')],
    [...]
)

Dosyayı kaydedin, sonra bu spec dosyasını argüman olarak vererek pyinstaller’ı çalıştırın.

bu kısmı anlamadım. diğer dediklerinizi yaptım ama bu kısım nasıl olacak?

Python dosyası yerine onun spec dosyasını argüman olarak vermekten bahsediyorum.

pyinstaller dosya.spec

şuan da çalıştırdığım zaman aldığım hata bu şekilde

Windows’u açtım. Programınızı exe’ye dönüştürdüm. Exe’yi de çalıştırdım, çalışmasında bir sıkıntı oluşmadı. Dosyayı da sizinle paylaşıyorum.

Ancak bir kaç düzeltme de yaptım.

  1. Selenium https://borsa.doviz.com/hisseler/SASA sitesinden verileri çekerken, tkinter penceresi donuyor. Bu işlemi başlatan fonksiyonu bir Thread nesnesinin hedefi haline getirdim.

  2. Programı sıfırdan kullanan birisinin bilgisayarında database isimli bir klasör olmayabilir. Dolayısıyla program açılırken, programın çalıştığı dizinde bir tane database klasörünün mevcut olup olmadığı kontrol edilebilir. Ayrıca aynı durum all_data dizini için de geçerli. Ancak veritabanlarıyla ilgili klasörleri exe dosyasının oluştuğu dizine attım, sizinle paylaştığım zip dosyasında bu klasörler ve içindeki dosyalar mevcut olacak. Dolayısıyla bu dizinlerin oluşturulmasına gerek yok.

  3. chromedriver.exe’yi programın çalıştığı dizine koydum. Adresini de dosyanın yeni konumuna göre yazdım.

Sizinle alakası yok ama anladığım kadarıyla matplotlib’in bazı dosyaları pyinstaller tarafından bir araya getirilemiyor. Bu sorunu da C:\Python37\Lib\site-packages dizininin içindeki matplotlib kütüphanesini dist'in içine atarak çözdüm.

Dosyayı indirin, bende çalışan exe dosyası sizde çalışacak mı bir görelim.

https://drive.google.com/file/d/1FOWtUUVc8BbK6udKialfcpv6hcLmTcP5/view

3 Beğeni

Henüz öğrenmediğim bir modül. Vesile olmasıyla beraber bugün öğrenmeye başlarım. Teşekkür ederim.

Bende paketledikten sonra aynı dizin içerisinde gerekli klasörleri oluşturacaktım. Teşekkür ederim bunun için de.

Dosyanın yeni konumu derken, ben şimdi klasörü nereye taşırsam açılıyor. Program chromedriver.exe nin konumunu otomatik mi alıyor sistemden?

evet bende sorunsuz bir şekilde program çalışıyor. Çok teşekkür ederim

Hayır, otomatik almıyor, chromedriver dosyanın bulunduğu dizinde yer alıyor. Adres olarak o dizin yazıldı.

tamam tamam şimdi anladım. eksik düşünmüşüm. Teşekkürler.

Rica ederim kolay gelsin.

1 Beğeni

Failed to execute script hatasını program içerisinde bir hata döndüğü zaman verir. Eğer hata olmadığından eminseniz derleme kısmında bir hata oluşmuş olabilir. Hatayı googlede aratıp pyinstallerin hataları görmezden gelmesini sağlayan birşey görmüştüm zamanında denemiştim işe yaramıştı onada bi göz atabilirsiniz

1 Beğeni

spec dosyasında ne gibi bilgiler tutuluyor. Ne işimize yarar. Bunları nereden öğrenebiliriz ? Mümkünse türkçe kaynak yoksa ingilizce paylaşır mısınız ?

Spec dosyası, python dosyasını executable hale getirirken pyinstaller’a verilecek olan talimatların yazıldığı “bir python scriptidir”. Bu talimatlar, python dosyamızın ihtiyaç duyacağı dosyaların veya kütüphanelerin tanıtılması olabilir, oluşacak python dosyasının bazı özelliklerinin tanıtılması, aktif edilmesi veya devre dışı bırakılması olabilir.

Spec dosyasının söz dizimi python’ın söz dizimidir. İhtiyaç duyulduğu taktirde, çalışma zamanında çalıştırılmak üzere bazı Python kodları da bu scripte yazılabilir.

Kaynak olarak, kendi dokümantasyonunu incelemenizi tavsiye ederim. Bir de tabi bildiğiniz gibi aklınıza takılan soruları google’a sorarak da cevaplar bulabilirsiniz.

https://pyinstaller.readthedocs.io/en/stable/spec-files.html

1 Beğeni