Bir Programi Arkaplanda Nasil Calistirabilirim?

Merhabalar,
Mesela örnek.py diye bir dosyamiz olsun.Bu dosya calisir durumda olsa bile bu uygulamayi görev cubugunda ve ekranda gorunur olmasini istemiyorum.(Kisaca bu uygulamayi arkaplanda calistirmak istiyorum.).Acaba nasil yapabilirim?

Windows üzerindeyseniz, dosyanın uzantısını .pyw yapın. Linux üzerinde böyle bir şeye ihtiyacınız yok.

Bu arada, internette aradığınızı bulamadığınızda soru sormanız daha iyi olur sizin açınızdan. Her zaman cevaplayacak birileri olmayabilir.

3 Beğeni

Tesekkurler.

Haklisiniz.Ama bu sorumu turkce olarak arattırdım bulamadim.İngilizce nasil aratabilirim bilmiyordum.Bu soruyu ingilizce olarak asagidaki sekilde arattırmak acikcasi 40 yıl düsünsem aklima gelmezdi.
how to run a python program in hide mode

how to run in background with python vs

Ben de ilk Python’a başladığımda neyi nasıl arayacağımı bilmiyordum… Ama ne kadar bozuk bir İngilizce ile yazıyor olsanız da, biraz uğraşla ve doğru anahtar kelimeler ile istediğinize ulaşabilirsiniz. (%100 çalışma garantili, kendim denedim :d)

2 Beğeni

Windowsda winapi kullanrak

Bu kodu başa ekleyin

import win32api
import win32console
import win32gui

win=win32console.GetConsoleWindow()
win32gui.ShowWindow(win,0)
5 Beğeni

eski bir konu ancak yeni bir konu açmaktansa buradan sormak istedim.
diyelimki; 3 tane ufak program parçası yazdık ve bunları main.py, isim.py ve dogumTarihi.py olarak kaydettik. main.py ile çalışırken isim.py programını bir değer ile çağırıp arka planda çalışmasını ve sonra bu değeri değiştirip yeni değer ile çalışmaya devam etmesini nasıl sağlayabilirim? mesela isim.py isim=“Ali” ve daha sonra isim=“Veli” gibi.
işletim sistemi rasbian.
Aslında yapmak istediğim pyaudio ve math ile oluşturduğum ses frekansını sürekli bir döngü ile çıkışa vermek. bu işlem arka planda devam ederken main.py ana programda frekans değerini değiştirip çıkışı yeni haliyle almaya devam etmek. ve ana programı sonlandirdigimda hepsinin kapanmasını sağlamak.

ne kadar sonra? veya ne yaptıktan sonra? bir de kodlarınızı paylaşabilirseniz iyi olur.

Yeni konu acsaymissin daha iyi olurmus zira bunun dogru cozumu arkaplanda ikinci bir program calistirmak degil, sesi ikinci bir thread’de uretmek.

Yapmak istedigin sey pyaudio gibi bir ses kutuphanesi icin cok yaygin ve basit bir sey. O kadar ki, thread’lerle ugrasmana bile gerek yok; 2 satirlik bir callback fonksiyonu yazsan yetiyor.

Ama tabi bunu Döngü değerini değiştirip yeniden başlatma 'da soylemistim.

2 Beğeni

sayın @aib. ben programı Python 3 te oluşturdum fakat pyaudio modülünü Python 3 için kuramadım. kuruldu yazıyor fakat içe aktarmıyor. Python 2 için kurulumu yaptım. sizin öneriniz olan callback python 2 olarak ayrı bir program. ben Python 3 te yazdığım ana programdan callback i çağırıp arka planda işimi görmeyi hedeflemistim.
import callback
callback.freq(frekans)
ile çağırıyorum Shell ile birlikte açılıyor. yani sadece çıkış vermesini beklerken Shell terminal ana programın üstüne çıkıyor.

Pyaudio kütüphasini hatasız bir şekilde kurup import pyaudio şeklinde çağırdığınızda bir hata alıyorsanız bu kurulumu hatasız yapamadığınız anlamına gelir. Ya sürümlerden kaynaklı bir sorun vardır ya da pip kullandıktan sonra bir hata verildiği halde görememişsinizdir. Ben windowsta pyhton3.7 ye pyaudio yu başarı ile indirmiştim.

Python 3.8 sürümünde pyaudio kurarken bir takım hatalar almıştım, biraz araştırmadan sonra, buradan : https://download.lfd.uci.edu/pythonlibs/t7epjj8p/PyAudio-0.2.11-cp38-cp38-win32.whl indirip pip ile kurulum yaptım ve sorun çözüldü. İşletim sisteminize ve python sürümünüze uygun wheel dosyasını buradan : https://www.lfd.uci.edu/~gohlke/pythonlibs/#jpype indirip pip ile kurabilirsiniz.

"""PyAudio Example: Play a wave file (callback version)."""

import pyaudio
import wave
import time
import sys

if len(sys.argv) < 2:
    print("Plays a wave file.\n\nUsage: %s filename.wav" % sys.argv[0])
    sys.exit(-1)

wf = wave.open(sys.argv[1], 'rb')

# instantiate PyAudio (1)
p = pyaudio.PyAudio()

# define callback (2)
def callback(in_data, frame_count, time_info, status):
    data = wf.readframes(frame_count)
    return (data, pyaudio.paContinue)

# open stream using callback (3)
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
                channels=wf.getnchannels(),
                rate=wf.getframerate(),
                output=True,
                stream_callback=callback)

# start the stream (4)
stream.start_stream()

# wait for stream to finish (5)
while stream.is_active():
    time.sleep(0.1)

# stop stream (6)
stream.stop_stream()
stream.close()
wf.close()

# close PyAudio (7)
p.terminate()
1 Beğeni

Anladim sayin @Engin_Kanat. Yine dogrusunun Python 3 icin pyaudio kurmak oldugunu soylemeden gecemeyecegim, ama:

Process’ler arasi iletisime IPC (inter-process communication) ismi veriliyor. Normalde bu iletisim IPC primitive dedigimiz mekanizmalar veya bunlarin uzerine kurulmus daha komplike sistemler ile oluyor. Pipe, socket, shared memory gibi primitifleri arastirmak isteyebilirsiniz.

Ama en kolayi bir dosya uzerinden haberlesmek. Kontrol eden program bir dosyaya istedigi frekansi yazabilir, kontrol edilen program da periyodik olarak bu dosyaya bakip icinde yazan frekans degismisse caldigini degistirebilir.

Arkaplanda bir programi calistirmak icin subprocess modulune bakabilirsiniz.

$ python3 -c 'import subprocess; p = subprocess.Popen(["python2", "-c", "import time; time.sleep(1); print(\"child\")"]); print("parent"); p.wait()'
parent
child
$

pyaudio Python 3 için Windows ortamında kuruldu fakat linux ta yine beceremedim. subprocess ile istediğimi gerçekleştirdim. böylece yeni bir şey öğrendim teşekkür ederim
sonuç istediğim gibi çıkmadı. çıkan frekansta anlık kesilmeler oldu. bunun sebebi de math ile hesaplanan sinyalin belirli bir uzunlukta olması. biterbitmez yeniden okumaya çalıştığımda bir süre kesilme oluyor. bende ad9833 entegresi kullanarak istediğim sonucu aldım.
serial ile ilgili problemi çözmek için uğraşıyorum şu sıralar. Arduino Nano ya frekans değerini serial olarak gönderiyorum Arduino ide serial monitor açık olduğu sürece seri iletişim gerçekleşiyor. bunlar açık değilse gerçekleşmiyor.

Belki bu linklerdeki işlemler Raspbian işletim sisteminize pyaudio kurmanızı sağlar:
https://www.raspberrypi.org/forums/viewtopic.php?t=25173

sudo apt install python3-pyaudio?

Evet, cok normal :slight_smile: Birden fazla thread kullanmak lazim, bunun en kolay yolu da bahsettigim callback mekanizmasi.

Ama nusuth, sorun cozulmus.

Baska konu basligi aslinda da, serial monitor kapali oldugu surece iletisim gerceklesiyor olmasin? Acikken Arduino programlanamiyor bile (ama upload tusu kapatiyor IIRC).

evet aslında iletişim gerçekleşiyor. fakat farklı bir veri tipindemi geliyor anlamadım. Python programda string olarak gönderiyorum
ser.write(‘4600’.configure())
şeklinde. configure bunu byte - byte gönderiyor b’4600’ gibi. karşı taraftan da Serial.parseInt(veri) olarak alıyorum. sadece seri monitör açıkken çalışıyor. hatta seri monitörü kapatsam bile çalışmaya devam ediyor. bilgisayarı tekrar başlatıp programı çalıştırdığımda yine işe yaramıyor. bilmiyorum anlatabildim mi

configure mu? Hem de str metodu? decode('ascii')'yi hatirlatip geciyorum.

parseInt baya sikintili - timeout’u filan var.

Sonuna \n koyarak yollamayi denemek isteyebilirsin.
Olmadi network byte order uint16_t olarak yollamak daha kolay olabilir. (https://docs.python.org/3/library/struct.html#format-characters !H)

doğru ‘decode’ configure nereden çıktı…