[ÇÖZÜLDÜ] Shell scripte python entegrasyonu

merhabalar arkadaşlar:
Bioinformatik analiz için kullandığım shell script yazdım bu script içerisinde bir adet python scripti kullanmam gerekiyor python ile yazdığım script kullanacağı dosyaları bash içerirsinde ki döngüde tanımlanmış olan dosyaları alarak yapıcaklarını yaptıktan sonra bir sonra ki dosyaya geçmesi gerekiyor ancak bash ile pythona dosyayı nasıl tanıtacağımı çözemedim yardımcı olabilir misiniz?

çözüm olarak düşündüğüm yöntem belki fikir verebilir size python içerisinde dosyaları input fonksiyonu ile tanımlatıp shell içerisinde ki dosyayı verebilir isem sorun çözülür diye düşünüyorum.

teşekkür ederim

Yanılmıyorsam aşağıdaki gibi olması lazım.

#!/bin/bash
python3 <<END
# Python kodları buraya yazılacak.
END

@dildeolupbiten hızlı dönüşün için teşekkür ederim.

kodu yazdığımda şu şekilde bi hata aldım

Desktop/python.sh
Dosya yolunu giriniz: Traceback (most recent call last):
File “”, line 16, in
EOFError: EOF when reading a line

kullandığım kodlar şu şekilde:

#!/bin/bash
python3 <<END
import os 
import pandas as pd
def hastalik(dosya):
    database = pd.read_excel('gen.xlsx')
    vcf = pd.read_excel(dosya)
    dfdata = pd.DataFrame(database)
    dfvcf = pd.DataFrame(vcf)
    print(dfdata.columns)
    print(dfvcf.columns)
    merge = pd.merge(dfdata, dfvcf, on=dfdata.columns[2],how='inner')
    merge.to_excel('deneme.xlsx')
a = input('Dosya yolunu giriniz: ')
hastalik(a)
END

EOF hatası standart giriş yönlendirildiği için yükseltiliyor. Bu arada aşağıda gösterildiği gibi de yapabilirsiniz.

#!/bin/bash
python3 -c '
import os 
import pandas as pd
def hastalik(dosya):
    database = pd.read_excel("gen.xlsx")
    vcf = pd.read_excel(dosya)
    dfdata = pd.DataFrame(database)
    dfvcf = pd.DataFrame(vcf)
    print(dfdata.columns)
    print(dfvcf.columns)
    merge = pd.merge(dfdata, dfvcf, on=dfdata.columns[2],how="inner")
    merge.to_excel("deneme.xlsx")
a = input("Dosya yolunu giriniz: ")
hastalik(a)
'

@dildeolupbiten çok teşekkür ederim sorunum çözüldü.
dipnot adamsın :slight_smile:

Ben anlamadim, python dosyaadi.py niye yapmiyoruz?

Bi de Python programi dosya adini niye stdin’den aliyor, parametre olarak almiyor?
Veya niye dosyanin icerigi yerine ismini stdin’den aliyor?

Bu yazdiklarimin hepsi standart seyler, yukarida gorduklerim ise hack :slight_smile:

Aslında @aib’e katılıyorum, yukarıda gösterildiği gibi kodları çalıştırmak yerine, bir py dosyasına Python kodları yazılır ve @aib’in gösterdiği şekilde kabuktan bu dosya çalıştırılabilir.

sevgili @aib , @dildeolupbiten dosya isimlerini for döngüsü ile ls -v kullanarak alıyorum ve bir değişkene atıyorum yapılacak işlemlere bu değişken üzerinden dosyayı veriyorum ancak pythona parametre olarak dosya ismini nasıl vereceğimi bilmediğim için böyle bi yönteme başvurdum

Dizindeki dosya isimlerini os.listdir() fonksiyonu ile de alabilirsiniz.

from os import listdir

dosyalar = lambda dizin: [i for i in listdir(dizin)]

# Alternatif:
# dosyalar = lambda dizin: list(map(lambda i: i, listdir(dizin)))

print(dosyalar("."))

Eğer sadece belli bir uzantıya sahip dosyaları listeye almak istiyorsanız yukarıdaki fonksiyonu aşağıdaki gibi değistirebilirsiniz.

from os import listdir

dosyalar = lambda dizin, uzanti: \
    [i for i in listdir(dizin) if i.endswith(uzanti)]

# Alternatif:
# dosyalar = lambda dizin, uzanti: \
#     list(filter(lambda i: i.endswith(uzanti), listdir(dizin)))

print(dosyalar(".", "txt"))

ls'in ciktisi insan icin, script icin degil. Dosya listesi icin find(1) veya kullandigin shell’in glob fasilitelerini kullanabilirsin.

Python’a parametre olarak dosya ismi vermek icin python dosyaismi yaziyorsun. Python’da sys.argv olarak erisiyorsun.

Anladigim kadariyla shell script deneyimin fazla yok, butun kodu python’a tasimani oneriyorum. @dildeolupbiten’in ornekledigi os modulune bakabilirsin. Shell script’ler yanlis yazima ve hatali calismaya cok aciklar.

merhaba arkadaşlar değerli cevaplarınız için teşekkür ederim. dediğiniz işlemleri yaparken şöyle bir sorun ile karşılaştım. şimdi input klasörümden aldığım dosyayı ensembl vep programı ile işledikten sonra bazı manipülasyonlar yapıp formatını csvden xlsx’e dönüştürmem gerekiyor. bunun için bir script yazdım gayet iyi bir şekilde çalışıyor ancak dosyaismi.csv olarak aldığım dosyayı dosyaismi.xlsx şeklinde diğer dosyanın yanına kayıt edemiyorum. bu konuda yardımcı olabilir misiniz?

yazdığım script bu şekilde

import os
os.chdir("/home/ertan/Desktop/result/output")
print(os.getcwd())

import pandas as pd

list=[]
for i in listdir("/home/ertan/Desktop/result/output"):
    if i.endswith('.csv'):
        list.append(i)
        print(i)

for i in list:
    csv = pd.read_csv(i)
    dfcsv = pd.DataFrame(csv)
    
    writer = pd.ExcelWriter(i+{}.format(xlsx))
    dfcsv.to_excel(writer, index=False)
    writer.save()

ExcelWriter fonksiyonuna tırnak işaretleri içerisinde bir kelime verirsem o isimle dosyayı oluşturuyor ancak i yazarsam tırnaksız “ValueError: No engine for filetype: ‘csv’” hatası alıyorum

Yukarıdaki kısımda bir hata var sanki.
Şöyle olması gerekmiyor mu?

writer = pd.ExcelWriter(f"{i}.xlsx")
# veya
writer = pd.ExcelWriter("{}.xlsx".format(i))

@dildeolupbiten sorunumu çözdün çok teşekkür ederim.

şimdi benim şöyle bi iyileştirme yapmak istiyorum. scripti yürüttüğüm zaman tek bir thread kullanıyor bunu multithread olarak kullanmasını nasıl sağlayabilirim? sistemim çift çekirdek 4 thread’a sahip

yazdığım script

import pandas as pd
import os
from os import listdir

os.chdir("/home/detagen/Desktop/result/output")
#print(os.getcwd())
#print(os.listdir('/home/detagen/Desktop/result/output'))

list=[]
for i in listdir("/home/detagen/Desktop/result/output"):
    if i.endswith('.csv'):
        list.append(i)

for a in list:
    csv = pd.read_csv(a)
    dfcsv = pd.DataFrame(csv)
    writer = pd.ExcelWriter('{}.xlsx'.format(a))
    dfcsv.to_excel(writer, index=False)
    writer.save()

xlsxlist=[]
for b in listdir("/home/detagen/Desktop/result/output"):
    if b.endswith('.xlsx'):
        database = pd.read_excel(
                "/home/detagen/Desktop/programlar/ensembl-data/disease/Hastalik gen tek satir.xlsx")
        dfdata = pd.DataFrame(database)
        
        vcf = pd.read_excel(b)
        dfvcf = pd.DataFrame(vcf)
        
        merge = pd.merge(dfdata, dfvcf, on=dfdata.columns[0],
                         how='inner')
        merge.to_excel('{}-disease.xlsx'.format(b))

Tekrar merhaba.

Sizi araştırmaya teşvik etmeye çalışmak daha doğru bir yol olmaz mı diye düşünüyorum aslında.

Mesela, YazBel belgelerinde Python’ın threading modülünün birebir çevirisi var. Üstelik anlatılan başlıklarla alakalı iyi kötü örnekler de var. Yani öncelikle araştırmanızı yapmanız, araştırma esnasında anlamadığınız veya açıklanmasını istediğiniz bir konuyu veya konuları bizimle veya size yardım edebileceğini düşündüğünüz birileriyle paylaşmanız daha iyi olmaz mı? Lütfen yanlış anlamayın beni.

Threading Modülü Türkçe Kaynak: https://belgeler.yazbel.com/python-istihza/standart_moduller/threading.html

Sevgili @dildeolupbiten zaten araştırma konularını oldukça fazla seviyorum yeni şeyler keşfetmeyi filan ancak en uygun olucak keyworde karar veremediğim için bir başlık açmaya karar vermiştim. Yazbel bünyesinde multithreading kütüphanesinin türkçe olarak saklandığını bilmiyordum bu bilgi için teşekkür ederim daha önce karşıma çıkmamıştı ingilizcem de çok yeterli olmadığı için anlayamamıştım documentlerini

O halde sizi iyi okumalar dilerim. :innocent: