Сценарий Python, открывающий приглашение bash и завершающий работу сценария - PullRequest
3 голосов
/ 16 ноября 2010

Я хочу написать оболочку chroot на python.Скрипт будет копировать некоторые файлы, настраивать некоторые другие вещи, а затем выполнять chroot, и должен посадить меня в оболочку chroot.

Хитрость в том, что я не хочу, чтобы процессы python выполнялись после того, как я в chroot.

Другими словами, python должен выполнить настройку, вызвать chroot и завершить себя, оставив меня в оболочке chroot.Когда я выхожу из chroot, я должен быть в каталоге, в котором находился, когда вызывал скрипт python.

Возможно ли это?

Ответы [ 2 ]

2 голосов
/ 16 ноября 2010

Моей первой мыслью было бы использовать одну из функций os.exec*. Это заменит процесс Python на процесс chroot (или что вы решите запустить с exec*).

# ... do setup work
os.execl('/bin/chroot', '/bin/chroot', directory_name, shell_path)

(или что-то в этом роде)

0 голосов
/ 16 ноября 2010

В качестве альтернативы вы можете использовать новый поток для команды popen, чтобы избежать блокировки основного кода, а затем передать результаты команды обратно.

import popen2
import time
result = '!' 
running = False

class pinger(threading.Thread):
    def __init__(self,num,who):
        self.num = num
        self.who = who
        threading.Thread.__init__(self)

    def run(self):
        global result
        cmd = "ping -n %s %s"%(self.num,self.who)
        fin,fout = popen2.popen4(cmd)
        while running:
            result = fin.readline()
            if not result:
                break
        fin.close()

if __name__ == "__main__":
    running = True
    ping = pinger(5,"127.0.0.1")
    ping.start()
    now = time.time()
    end = now+300
    old = result
    while True:
        if result != old:
            print result.strip()
            old = result
        if time.time() > end:
            print "Timeout"
            running = False
            break
        if not result:
            print "Finished"
            break
...