Başka Python dosyasındaki değişkene ulaşıp fonksiyonda kullanmak

Merhaba,
Elimde desenler, fonksiyonlar ve raporla adında 3 adet python dosyası var.
desenler.py dosyası içerisinde re modülünü kullanarak esleştirmek istediğim desen değişkenlerim var.
foksiyonlar.py dosyası içerisinde yazdır (konsola / ekrana basma) ve kaydet fonksiyonları mevcut.
raporla.py dosyası içerisinde;

  • desenler.py dosyasında tanımlı değişken isimlerini bir listede topluyorum.
  • Bu değişken (desen) isimlerini fonksiyonlar.py dosyasındaki yazdır ve kaydet fonksiyonlarına parametre olarak vermek istiyorum.

Maalesef istediğimi bir türlü gerçekleştiremedim.
Örnek kodlar aşağıdadır.
Ne yapmam gerekiyor? Nasıl bir yöntem kullanmam gerekir?
Acaba Exceldeki Dolaylı fonksiyonuna benzer bir yöntem mi kullanmalıyım?

desenler.py içeriği; (bu dosya TXT uzantılı da olabilir)

##### Brinell_Sertlik Test Sonucu Deseni ##################################################################################
desen_brinell_sertlik = r"Brinell\s+\d+\.\d+\s+HBW"      # Örnek eslesme: "Brinell   195.10  HBW 2,5/187,5  EN ISO 6506-1"
###################################################################################

##### Çekme Deneyi - Kopma Uzaması (A5) Sonucu Deseni #############################################################################
desen_kopma_uzamasi = r"A5\s+\d+\.\d+\s+%\s+EN ISO 6892-1 Metod B"  # Örnek eslesme: "A5  7.000  %  EN ISO 6892-1 Metod B"
###################################################################################################################################

##### CONTA NUMUNESİ - Kopma Mukavemeti Sonucu Deseni ########################################################################################
desen_conta_kopma_mukavemeti = r"\*\w+\s+\w+\s+\d+\.\d+\s+N/mm\^2  TS ISO 37"  # Örnek eslesme: "*Kopma Mukavemeti   12.00  N/mm^2  TS ISO 37"
###############################################################################################################################################

fonksiyonlar.py dosya içeriği;

import re

##### "pdf_verisi.txt" isimli dosya içeriğini oku, desen ile eşleşen değerleri Konsola yazdır. ####
def yazdir(desen):
    with open("pdf_verisi.txt", "r", encoding="utf8") as dosya:
        icerik = dosya.read()
        eslesme = re.findall(desen, icerik)
        for deger in eslesme:
            print(deger)      # esleşen değerleri alt alta yazdır, ekrana bas.  
####################################################################################################

##### "pdf_verisi.txt" isimli dosya içeriğini oku, desen ile eşleşen değerleri "Rapor_Degerleri.txt" isimli dosyaya ekle / kaydet. ####
def kaydet(desen):
    with open("pdf_verisi.txt", "r", encoding="utf8") as dosya:
        icerik = dosya.read()
        eslesme = re.findall(desen, icerik)
        with open("Rapor_Degerleri.txt", "a", encoding="utf8") as kaydet:
            for deger in eslesme:
                kaydet.write(deger.replace(".", ",") + "\n")    # "." nokta karakterini "," virgül ile değiştir, sonra kaydet.
########################################################################################################################################

raporla.py dosya içeriği;

import PDF_to_TXT       # "veriyi_kaydet()" fonksiyonunu sadece bir kez çalıştırıp PDF Dosya içeriğini "pdf_verisi.txt" adıyla kaydetmek için kullanacağız.
import re, fonksiyonlar

##### PDF_to_TXT.py dosyasındaki "veriyi_kaydet()" fonksiyonunu çalıştır ###
# PDF_to_TXT.veriyi_kaydet()    # 1 kez çalıştırılmalı
############################################################################

##### Desen İsimlerini Guncelleyen Fonksiyon ###################
desen_listesi = []
pattern = r'\w+\s+=\s+r"'

def desen_listesini_guncelle():
    with open("desenler.py", "r", encoding="utf8") as dosya:
        icerik = dosya.read()
        eslesme = re.findall(pattern, icerik)
        for desen_adi in eslesme:
            desen_listesi.append(desen_adi[:-5])

desen_listesini_guncelle()

### Desen isimlerini ekrana yazdır, kontrol et.
for i in desen_listesi:
    print(i)
###############################################################    

#### Fonksiyonları sırayla çalıştır ############
for desen_adi in desen_listesi:
    fonksiyonlar.yazdir(desen_adi)
  #fonksiyonlar.yazdir(desenler.desen_adi) # bu kod da hata veriyor ki, normal :)
################################################    

Doğru anlayıp anlamadığımdan emin değilim

Nasıl topluyorsunuz?

fonksiyonlar.py dosyasına parametre olarak vermek istediğiniz değerler, desenledeki değişkenler mi?

Bu durumda basitçe neden hangi py dosyanızda ne kullanacaksanız import etmiyorsunuz?

import desenler.py yapmanıza engel bir durum mu var?

Tahribatlı muayene iyidir de tahribatsız muayene candır.

Nasıl topluyorsunuz?

raporla.py dosyası içerisindeki desen_listesini_guncelle() fonksiyonu ile topluyorum ;

##### Desen İsimlerini Guncelleyen Fonksiyon ###################
desen_listesi = []
pattern = r'\w+\s+=\s+r"'

def desen_listesini_guncelle():
    with open("desenler.py", "r", encoding="utf8") as dosya:
        icerik = dosya.read()
        eslesme = re.findall(pattern, icerik)
        for desen_adi in eslesme:
            desen_listesi.append(desen_adi[:-5])

desen_listesini_guncelle()

fonksiyonlar.py dosyasına parametre olarak vermek istediğiniz değerler, desenledeki değişkenler mi?

Evet, desenlerdeki değişkenleri, fonksiyona parametre olarak vermek istiyorum. Örneğin;

yazdir(desenler.desen_brinell_sertlik)

ya da

yazdir(r"Brinell\s+\d+\.\d+\s+HBW")

her iki kod da aynı sonucu veriyor.

Bu durumda basitçe neden hangi py dosyanızda ne kullanacaksanız import etmiyorsunuz?
import desenler.py yapmanıza engel bir durum mu var?

desenler.py dosyasını import ederek te denedim, başaramadım.
Yani desenler.py dosyasındaki değişkenleri manuel olarak yazarak sonuc elde edebiliyorum ancak, bir döngüye sokarak otomatik sonuc elde edemiyorum.
desenler.py dosyasına yeni desen eklense ya da mevcut desenlerden bir lkaçı silinse, kodları manuel olarak düzenlemek gerekecek. Bu boşa vakit kaybı demek.

Her bir Rapor sonucunu elde etmek için, ayrı python dosyaları oluşturup yapmak istediğimi gerçekleştirdim ancak her dosyada benzer fonksiyonlar var. Fonksiyonda bir değişiklik yapmak istesem, her birini açıp ayrı ayrı değiştirmem gerekir. Bu pratik ve istenilen bir şey değil.

Tahribatlı muayene iyidir de tahribatsız muayene candır.

Kesinlikle :slight_smile:

Başaramamanız konusunda biraz bilgi alabilir miyim. İmport ettiğinizde bütün değişkenleri zaten almış olursunuz.

Aklıma python - How can I import a module dynamically given its name as string? - Stack Overflow

Gibi istisna yöntemler dahi geldi ama biraz daha açıklama gerekiyor.

Bu sadece metin aktarmak gibi bir durum import gibi değil.

semtex

Bu sadece metin aktarmak gibi bir durum import gibi değil.

Doğru, o kısım sadece değişken isimlerini bir listede toplamak için kullanılan kod parçası.

Desenler biraz kafa karıştırıcı olmuş olabilir. Sorumu daha basit kodlarla anlatmaya çalışayım müsadenizle.

kisiler.py dosyası değişkenleri barındırıyor ;

ali = "ilkokul"
ayse = "ortaokul"

fonk.py dosyası adı üstünde (print) fonksiyonunu barındıran dosya;

def bilgi(kisi):
    print(kisi + " öğrencisi")

sorgu.py dosyası, kişiler.py dosyasındaki değişkenleri alıp, fonk.py dosyasındaki bilgi() fonksiyona tek tek uygulaması gereken kodları barındıran dosyam;

import kisiler, fonk

fonk.bilgi(kisiler.ali)
fonk.bilgi(kisiler.ayse)

Yukarıdaki gibi tek tek değişkenleri yazdığımda kod doğru çıktıyı veriyor;

ilkokul öğrencisi
ortaokul öğrencisi

İstediğim ise, kişiler.py dosyasındaki değişkenleri, bir döngü ile fonk.py dosyasındaki fonksiyona parametre olarak aktarmak. Ancak tüm bunları sorgu.py dosyası içinde yapabilmek. Yani Kişilere yeni değişken (öğrenci) eklendiğinde ya da silindiğinde, manuel ekleme çıkarma yapmak zorunda kalmayayım.

Yok desenler gayet anlaşılır nitelikte.

Bir string değişkenden ibaret gibi duruyor şimdilik.

python - Importing variables from another file? - Stack Overflow

from desenler.py  import * 

gibi bir kullanımla.

Desen değişkenlerini kullanmakta ne gibi bir zorluk yaşadığınızı anlayamadım.

desen_brinell_sertlik

dediğiniz her yerde artık "Brinell\s+\d+\.\d+\s+HBW"

verisini ifade edecektir.

Yada bir py dosyasındaki değişkenlerin listesini istiyorsak

How to get a list of variables in specific Python module? - Stack Overflow

Gibi bir enumerasyonla herhangi bir listedeki değişkenlerin listesini elde edebiliriz.

Kusura bakmayın çok soru soruyorum anlama adına.

Yapılmaz ve tuhaf bir şey göremedim.

semtex

Kusura bakmayın çok soru soruyorum anlama adına.

Estağfurullah, ne kusuru. Vakit ayırıp bana ceva yazıyorsunuz :slight_smile:

Söylediğiniz şekilde (aşağıdaki kodlar ile) zaten istediğimi yapabiliyorum ancak kaydet() ya da yazdir() fonksiyonlarını, desen adı kadar (örneğin 7 kez) yazmam gerekiyor.

import re
from fonksiyonlar import *
from desenler import *

#### yazdir() Fonksiyonunu Çalıştır ############
yazdir(desen_akma_dayanimi)
yazdir(desen_brinell_sertlik)
yazdir(desen_cekme_gerilmesi)
yazdir(desen_conta_kopma_mukavemeti)
yazdir(desen_conta_uzama)
yazdir(desen_kimyasal)
yazdir(desen_kopma_uzamasi)
################################################    

#### kaydet() Fonksiyonunu Çalıştır ############
kaydet(desen_akma_dayanimi)
kaydet(desen_brinell_sertlik)
kaydet(desen_cekme_gerilmesi)
kaydet(desen_conta_kopma_mukavemeti)
kaydet(desen_conta_uzama)
kaydet(desen_kimyasal)
kaydet(desen_kopma_uzamasi)
################################################

Aşağıdaki şekilde (örnek) kod yazıp çalıştıramadım;

import re
from fonksiyonlar import *
from desenler import *

for desen_adi in desenler:
    kaydet(desen_adi)

Rica etsem kisiler.py dosyası oluşturup içerisine şunu kaydetseniz;

ali = "ilkokul"
ayse = "ortaokul"

Ardından fonk.py dosyası oluşturup içine bu fonksiyonu kaydetseniz;

def bilgi(kisi):
    print(kisi + " öğrencisi")

Son olarak sonuc.py dosyası oluşturup, kisiler.py dosyasındaki değişkenleri for döngüsü ile fonk.py dosyasındaki bilgi() fonksiyonuna parametre olarak aktaran bir kod yazabilir misiniz?

from kisiler import *
from fonk import *

my_list=[]
my_list.append([item for item in dir() if not item.startswith("__")])



print(my_list)

image

Kod bütün değişkenleri bir listeye alır.

Siz hangi dosyadaki hangi değişkeni isterseniz onu alabilirsiniz.

Sonra fonksiyonunuza hangi değişkeni verecekseniz o listeden gönderebilirsiniz.

Sorun yaşarsanız kodu geliştirmeye çalışalım.

Sanırım nerede takıldığınızı anladım. Yine yanlış anladı isem düzeltiriz.

from kisiler import *
from fonk import *

my_list=[]
my_list=[item for item in dir() if not item.startswith("__")]


str1= str(my_list[1])

value = globals()[str1]

bilgi(value)

Aldığınız stringleri globals ile tekrar değişken ismi olarak kullanabilirsiniz.

Kodu çalıştırdığımda:

image

İsim yerine eşitlendiği Ayse için ortaokul verisini yazdırdırk.

Not: Sadece orijinal soruyu okudum

import desenler
#### Fonksiyonları sırayla çalıştır ############
for desen_adi in desen_listesi:
    fonksiyonlar.yazdir(desen_adi)
  #fonksiyonlar.yazdir(desenler.desen_adi) # bu kod da hata veriyor ki, normal :)
    fonksiyonlar.yazdir(getattr(desenler, desen_adi))

↑ Soyle oluyor mu?

“Dogru” yol desenler.py’de dictionary saklamak:

DESENLER = {
    'brinell_sertlik': r"Brinell\s+\d+\.\d+\s+HBW",
    ...
}

ama tabi pratikligi dosyanin nasil olusturulduguna gore degisir.

Eger bu kadar bile degisiklik yapmak zor oluyorsa py uzantisindan vazgecip bi txt formati uretmek:

##### Brinell_Sertlik Test Sonucu Deseni ##################################################################################
# Örnek eslesme: "Brinell   195.10  HBW 2,5/187,5  EN ISO 6506-1"
desen_brinell_sertlik Brinell\s+\d+\.\d+\s+HBW
###################################################################################

##### Çekme Deneyi - Kopma Uzaması (A5) Sonucu Deseni #############################################################################
# Örnek eslesme: "A5  7.000  %  EN ISO 6892-1 Metod B"
desen_kopma_uzamasi A5\s+\d+\.\d+\s+%\s+EN ISO 6892-1 Metod B
###################################################################################################################################

##### CONTA NUMUNESİ - Kopma Mukavemeti Sonucu Deseni ########################################################################################
# Örnek eslesme: "*Kopma Mukavemeti   12.00  N/mm^2  TS ISO 37"
desen_conta_kopma_mukavemeti \*\w+\s+\w+\s+\d+\.\d+\s+N/mm\^2  TS ISO 37
###############################################################################################################################################
desenler = {}
with open('desenler.txt', 'r', encoding='utf-8') as f:
    for satir in f.readlines():
        satir = satir.strip() # Desen sonundaki bosluklara dikkat
        if len(satir) == 0 or satir.startswith("#"):
            continue
        split = satir.split(maxsplit=1)
        desenler[split[0]] = split[1]

veya .INI veya JSON gibi data tasimaya daha uygun bir format kullanmak daha kolay olabilir.

Bu arada daha bugun ayni sorunla karsilastim. Bildigin print("LOCATIONS = [") seklinde .py dosyasi urettim, projenin geri kalaninda kolayca kullanabilmek icin. “Bazi script’leri generic yapayim, dosya ismini parametre olarak alayim” dedigimde patladi; Python’da yolu bilinen bir .py dosyasini import etmek kolay degil. Gecici script yazip (from proje_adi import locations) gectim, bir yandan “JSON veya pickle filan mi yazsaydim” diye dusunurken. Sonra zaten baska bir yerde ihtiyac duymayacagim ortaya cikti, biraktim.

1 Beğeni

Çok teşekkür ederim,
globals() fonksiyonunun varlığından haberdar değildim.
Desen isimlerini farklı bir yöntem ile zaten elde edebiliyordum ama aşağıdaki kod çok daha pratikmiş. :slight_smile:

my_list=[item for item in dir() if not item.startswith("__")]

Kodlarımı, globals() fonksiyonuna göre aşağıdaki şekilde revize edince amacıma ulaştım (sayenizde).
Tekrar teşekkür ederim.

import re
from fonksiyonlar import *
from desenler import *

desen_listesi = []
pattern = r'\w+\s+=\s+r"'

##### Desen Listesini Güncelleyen Fonksiyon #################
def desen_listesini_guncelle():
    with open("desenler.py", "r", encoding="utf8") as dosya:
        icerik = dosya.read()
        eslesme = re.findall(pattern, icerik)
        for desen_adi in eslesme:
            desen_listesi.append(desen_adi[:-5])

desen_listesini_guncelle()
#############################################################

##### Desen listesini sırası ile ekranayazdır ###############
# for desen_adi in desen_listesi:
#     print(desen_listesi.index(desen_adi)+1, desen_adi)
#############################################################
# print(desen_listesi)

##### ÇÖZÜM 1 - Yazbel'den semtex'in cevabı
##### Fonksiyonlar ##########################################
def raporu_yazdir():
    for desen_adi in desen_listesi:
        desen_adi_string = str(desen_adi)
        desen_degeri = globals()[desen_adi_string]
        yazdir(desen_degeri)

def raporu_kaydet():
    for desen_adi in desen_listesi:
        desen_adi_string = str(desen_adi)
        desen_degeri = globals()[desen_adi_string]
        kaydet(desen_degeri)
# #############################################################

##### Fonksiyonları Çalıştır #####
# raporu_yazdir()
# raporu_kaydet()
##################################

aib

26d

import desenler
#### Fonksiyonları sırayla çalıştır ############
for desen_adi in desen_listesi:
    fonksiyonlar.yazdir(desen_adi)
  #fonksiyonlar.yazdir(desenler.desen_adi) # bu kod da hata veriyor ki, normal :)
    fonksiyonlar.yazdir(getattr(desenler, desen_adi))

↑ Soyle oluyor mu?
“Dogru” yol desenler.py’de dictionary saklamak:
Eger bu kadar bile degisiklik yapmak zor oluyorsa py uzantisindan vazgecip bi txt formati uretmek:

Teşekkür ederim.
Desenleri dictionary olarak saklamak hiç aklıma gelmedi, haklısınız.

Cevabınızdaki şu kod parçacığı sorunumu çözdü.

fonksiyonlar.yazdir(getattr(desenler, desen_adi))

getattr() fonksiyonundan da bihaberdim maalesef.

Sizin Çözüm önerinizi koduma uyguladığımda aşağıdaki kodları elde etmiş ve sorunumu çözmüş oldum (Sorunumun 2. Çözüm yöntemi ):

import re, fonksiyonlar, desenler

desen_listesi = []
pattern = r'\w+\s+=\s+r"'

##### Desen Listesini Güncelleyen Fonksiyon #################
def desen_listesini_guncelle():
    with open("desenler.py", "r", encoding="utf8") as dosya:
        icerik = dosya.read()
        eslesme = re.findall(pattern, icerik)
        for desen_adi in eslesme:
            desen_listesi.append(desen_adi[:-5])

desen_listesini_guncelle()
########################################################

##### Sonucları ekrana bas #################################
for desen_adi in desen_listesi:
    fonksiyonlar.yazdir(getattr(desenler, desen_adi))
########################################################
1 Beğeni