Çalışıyor gibi ama dizin değişmiyor

Merhabalar, Termux’da sık kullandığım dizinlere erişmek için aşağıdaki kodu yazdım. Çalışıyor gibi os.getcwd ile değiştirilen dizini basabiliryorum. Fakat Ana Dizin değişmiyor yani ls komutu verdiğimde Ana Dizin listeleniyor. Belirttiğim, gitmek istediğim dizin yerine.

import os

islem = input('''
(1) SDCard Projeler
(2) SDCard Diğer (1)
(3) Termux Ana Ekran
''')

if islem == '1':
  os.chdir("/storage/A894-12FA/Projeler")
elif islem == '2':
  os.chdir("/storage/A894-12FA/Diğer (1)")
elif islem == '3':
  os.chdir("/data/data/com.termux/files/home")

print(os.getcwd())

Merhabalar,

ls komutunu vermiyorsunuz.

Baska bir programda veriyorsaniz, python’daki CWD baska bir programin CWD’sini etkilemez.

Script’in termux’la baglantisini anlatmamissiniz, fakat cd $(python cd.py) gibi bir komutla termux’a script’in istedigi yere gitmesini soylemeniz lazim.

Önce çalışıp çalışmadığını görüp sonra Termux ile bağlantısını sağlama düşüncesindeydim. Çalışmamasının sebebi o mu? Ben çalıştırabilmek için exe gibi bir dosya türüne dönüştürme işlemi gerekir diye düşünmüştüm.

Anlatamadıysam; Kodu çalıştırdığımda, içindeki os.getcwd ile sadece gitmek istediğim dizin print ediliyor ve hiçbirşey yapmıyor. Belirtiğim dizine gitmiyor Ana Dizinde kalıyor.

Merhaba,

Aşağıdaki konu sizin sorunuzla benzer. Buradaki püf nokta, termux, cmd, terminal gibi uygulamaların arka planda nasıl çalıştığını anlamakta. Öncelikle aşağıya attığım faydalı olacağını düşündüğüm posta bakınız.

Sonrasında bir örnekle daha anlatmaya çalışayım.

burada bir terminal uygulaması en basit haliyle nasıl yapılır anlatmaya çalışmış. Ben biraz açacağım burayı.

Evet şunun üzerinden anlatalım.

Şimdi bir terminal uygulaması oluşturdun diyelim. Bu terminal uygulaması başlatıldığı zaman işletim sistemi arka planda bir process başlatır. Evet elimizde bir process var. Şimdi bir kod parçasını inceleyelim.

int lsh_launch(char **args)
{
  pid_t pid, wpid;
  int status;

  pid = fork();
  if (pid == 0) {
    // Child process
    if (execvp(args[0], args) == -1) {
      perror("lsh");
    }
    exit(EXIT_FAILURE);
  } else if (pid < 0) {
    // Error forking
    perror("lsh");
  } else {
    // Parent process
    do {
      wpid = waitpid(pid, &status, WUNTRACED);
    } while (!WIFEXITED(status) && !WIFSIGNALED(status));
  }

  return 1;
}

burada fork diye bir fonksiyon kullanıldığını göreceksin. bu fork fonksiyonu, bir child process başlatır.

Şimdi Program CounterRegister falan girerdim de seviyeni bilmediğim için girmek istemiyorum. Hem konudan uzaklaşacağız.

Şimdi bu fork child da olsa ayrı bir process başlatıyor. sen python veyahut başka bir dilde os.getcwd veya os.chdir gibi methodlar kullandığın zaman aslında işletim sisteminden, ilgili processin çalışma dizinini değiştirme isteğinde bulunuyoruz veya ilgili processin çalışma dizinini elde etme isteğinde bulunuyoruz.

Şimdi resmi bir anlatalım. Orada aslında iki tane process çalışıyor ve sen kendi komutunu child process te çalıştırıyorsun. senin çalıştırdığın komutlar child process’in working directory sini değiştiriyor. Parent process’in current working directory’si aynı kalıyor. Senin amacın parent process’in cwd’sini değiştirmek. Bunu da sanırım sadece cd gibi komutlarla yapabilirsin. Zaten terminal gibi uygulamalar da cd, ls gibi komutlar için ayrı bir child proces başlatmaz, direkt parent process de işletim sistemine os.chdir gibi methodlar kullanarak istek gönderir ve işletim sistemi de parent process’in cwd sini değiştirmiş olur. Attığım yazıya serisinden göz atarsan dediğim şeyi anlayabilirsin diye düşünüyorum.

Düzeltme: Resim hatalıydı resmi düzelttim.

2 Beğeni

Anladım. Teşekkür ederim uğraş verdiğiniz için.

1 Beğeni

getcwd(3) (ve os.getcwd) cagiran process’in CWD’sini dondurur. Yani gitmek istedigin yeri print ediyorsa gitmek istedigin yere gitmissindir.

Her process’in CWD’si ayridir, ve bir process’ten bir baskasininki (mesela python’dan termux’unkini) degistirilemez.

Termux icinde shell calistirdigini varsayarsak, shell’e cd $(python cd.py) veya cd $(python cd.py; cat gidilecek_yol.txt) gibi bir komut vererek baskasi tarafindan saglanan bir yola gitme komutu verebilirsin.

1 Beğeni