Python subprocess dizin nasıl değiştirilir?

Nasıl bir şekilde değiştirmek istediğini bağlı

os.chdir("Directory adı")
subprocess.Popen("Yapılacak işlem")
os.chdir(wd) #Çalıştır
1 Beğeni

dostum attığın bu kod root a ls atıyo ? konu açıklamasında cd … yazmıştım görmedin galiba
terminalde hiç cd … yapmadın mı ?

bu doğru ama subprocess karşılığı lazım cd … yani

subprocess.call('cd ..', shell=True) # pointless code! See text below.

Bundan mı bahsediyorsun?

gibi bu çalışmıyo linux ta windows ta denemedim

subprocess.call(‘cd …’, shell=True)
0

böle yani sonra pwd yapınca hala aynı yerdeyim :smiley: çalışması lazım ama anlamadım.

subprocess.call("(cd ~/catkin_ws/src && catkin_make)", shell=True)

Bunu buldum Linux ile ilgili bir bakabilir misin?

Kaynak

Basladiktan sonra subprocess’in CWD’sini degistiremezsin, kendisinin degistirmesi lazim.

Subprocess’in CWD’sini degistirdin cunku? Subprocess ...'ya gidip bitti, sen ayni yerdesin.

2 Beğeni

tamam ozaman bu çalışıyo ileri geri gidiyor ama ben gittiğim dizinde ls pwd nasıl çalıştırmam gerekiyor ?

subprocess.call(["ls", "-l"])

Bu çalışıyor olmalı :no_mouth: :confused:

çalışıyor ama gidip geldiğim dizinde çalışmıyor aib inde dediği gibi subprocess başladığı yerde kalıyo çok garip bi olay anlayamadım :smiley:

burda güzel taktik verdi de kod a dökemedim :smiley:

subprocess.call("ls", cwd="path/to")

Bunu buldum birde

yarım sayfa hata çıktı :frowning:

Thats bruh moment ama. Bulucam illa bi taktiği vardır. Kırıcam kodu :rage:

1 Beğeni

bende bakıyom da sinirim bozuldu artık :smiley: saolasın.

Calistiramazsin, onlar ayri process’ler.

Subprocess’in adi ustunde; yeni process. CWD’sini sen verirsin veya parent’tan alir.


Ne yapmaya calisiyorsunuz arkadaslar?

1 Beğeni

hocam terminalde ileri geri gittiğimiz(change directory) gibi aynısını subprocess kullanarak yapmaya çalışıyorum :smiley: :smiley: daha önce subprocess ile bi maceram olmadığı için mantığını çözemedim. bulunduğum dizinden cd … yaptığım zaman pwd yapınca veya ls yapınca gittiğim dizinde çalışsın istiyorum. yani böyle bi şey oluyo mu ? terminal nasıl çalışıyor diye konu açmak istemiyorum :smiley:

İşletim sistemi dersi almadım, o yüzden hiçbir şey bilmeyen biri gibi anladığım şeyleri anlatmaya çalıştım, bir bilene ihtiyacım var :slight_smile:

Merhaba,

Wikipedia’ya bakarsan şu yazıları da göreceksindir.

cd is frequently included built directly into a command-line interpreter.

This is the case in most of the Unix shells (Bourne shell, tcsh, bash, etc.), cmd.exe on Microsoft Windows NT/2000+ and Windows PowerShell on Windows 7+ and COMMAND.COM on DOS/ Microsoft Windows 3.x-9x/ME.

Ben burada şunu anladım: cd komutunu senin gibi ayrı bir process olarak çalıştırmıyor, onun yerine kullanıcıdan aldığı komut string’ini önce parse ediyor, mesela eğer cd ise (atıyorum python’da os.chdir) fonksiyonunu çalıştırıyor. Bunu şu anda anlayamadın biliyorum. Sabret, en aşağıda çok iyi anlayacaksın ne demek istediğimi.

Command line shells on Windows usually use the Windows API to change the current working directory, whereas on Unix systems cd calls the chdir() POSIX C function.

Burada da işletim sistemlerinin bu iş için yukarıda söylediğim fonksiyon gibi fonksiyonlar kullandığını söylüyor.

This means that when the command is executed, no new process is created to migrate to the other directory as is the case with other commands such as ls. Instead, the shell itself executes this command. This is because, when a new process is created, child process inherits the directory in which the parent process was created. If the cd command inherits the parent process’ directory, then the objective of the command cd will never be achieved.

Şimdi biz bir komut çalıştırdığımızda bunlar genelde birtakım programlar oluyor ve shell bu programları çalıştırmak için yeni bir process oluşturup başlatıyor. Ama cd için böyle bir şey yapmadığını, bu işi direkt shell’in hallettiğini söylüyor.

This is because, when a new process is created, child process inherits the directory in which the parent process was created. If the cd command inherits the parent process’ directory, then the objective of the command cd will never be achieved.

Şu cümleyi hakkıyla anlayamadım ama anladığım kadarıyla diyor ki:
cd, working directory yi değiştirir.

Aşağıda bir shell var, bu shell’imiz, bizim parent process 'imiz.

>> run subprocess

Şimdi sana aşağıda parent process’ile subprocess’in benim tarafımdan oluşturulmuş hayali bir şemasını göstereceğim.

child process’de cd çalışmadan önce
main process:
- working directory: ~/Desktop

child process:
- working directory: ~/Desktop

child process’de cd .. çalıştıktan sonra

main process:
- working directory: ~/Desktop

child process:
- working directory: ~/

Ne demişti wikipedia da, eğer bir child process oluşturursak bu child process in working directory si parent process’in working directory’sidir. biz cd ile ancak working directory yi değiştirebiliyoruz. Working directory sadece child process’de değiştiriliyor. Bunu aşağıda örnekleyelim.

╭─cihat at jarbay51 in ~ 21-09-07 - 1:11:30
╰─○ python3 -c "import os; os.system('cd ~/Desktop/cmpe')"
╭─cihat at jarbay51 in ~ 21-09-07 - 1:12:08
╰─○ cd ~/Desktop/cmpe 
╭─cihat at jarbay51 in ~/Desktop/cmpe 21-09-07 - 1:12:29
╰─○ 

Anladığım kadarıyla anlatmaya çalıştım.

Şİmdi sana örnek bir shell atacağım. GitHub - codecrafters-io/build-your-own-x: Master programming by recreating your favorite technologies from scratch. bu linkten how to build own shell bölümünü bulup sayfaları kurcala, o zaman ütte yazdıklarımın bir değeri olacaktır.
edit: yazı tamamlandı
Edit2: sonradan parent directory kavramını çok yanlış kullandığımı fark ettim. Terminalde parent directory’e gitmek için cd .. yazmak yeterli. Benim anlatmaya çalıştığım şey (yani yazının özeti):

  1. terminalde bir komut çalıştırıldığında genelde yeni bir child process başlatılır.
  2. cd de ise böyle yapılmaz, bu işi direkt shell bizzat halleder. Çünkü eğer böyle yapmazsa cd, sadece child process’in working directory’sini değiştirir. parent process’in working directory’sini değiştirmez.

Önceki kullandığım parent directory kavramını yazımdan siliyorum, çünkü ben parent directrory yi çok yanlış anladığımı fark ettim.

4 Beğeni

Yapamazsin, cunku subprocess -adi ustunde- yeni cocuk process aciyor. Senin istedigin python process’inin CWD’sini degistirmek; o da chdir ile.

Shell’lerin nasil calistiklarini arastir zaten. Onlarda cd built-in, dedigim sebeplerden dolayi.

Gerci @Cihat_Altiparmak da yazmis aynisini, simdi okudum.

Bu arada cd ... komutunu kurcalarken ... directory’sinin var oldugundan emin olmak lazim.

1 Beğeni