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
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
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 ç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?
Basladiktan sonra subprocess’in CWD’sini degistiremezsin, kendisinin degistirmesi lazim.
Subprocess’in CWD’sini degistirdin cunku? Subprocess ...
'ya gidip bitti, sen ayni yerdesin.
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ı
ç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
burda güzel taktik verdi de kod a dökemedim
subprocess.call("ls", cwd="path/to")
Bunu buldum birde
yarım sayfa hata çıktı
Thats bruh moment ama. Bulucam illa bi taktiği vardır. Kırıcam kodu
bende bakıyom da sinirim bozuldu artık 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?
hocam terminalde ileri geri gittiğimiz(change directory) gibi aynısını subprocess kullanarak yapmaya çalışıyorum 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
İş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
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+ andCOMMAND.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 thechdir()
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):
Önceki kullandığım parent directory kavramını yazımdan siliyorum, çünkü ben parent directrory yi çok yanlış anladığımı fark ettim.
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.