2012-12-07 7 views
6

Chcę usunąć niektóre pliki dziennika mojego serwera aplikacji bez wyłączania mojego serwera. Do jakiej komendy można użyć tego przy pomocy Pythona, np. rm -rf w systemach Linux?Jak wymusić usunięcie w Pythonie jak rm -rf w systemie Linux?

Proszę o pomoc.

+2

Czy obejrzałeś [odniesienie do biblioteki Pythona] (http://docs.python.org/3/library/os.html#module-os)? –

+1

"force" usunąć? Czy masz problemy z kodem, który nie działa? –

+0

HI Chcę usunąć pliki dziennika przy użyciu WLST – user1344022

Odpowiedz

6
#!/usr/bin/env python    
import os 

def nukedir(dir): 
    if dir[-1] == os.sep: dir = dir[:-1] 
    files = os.listdir(dir) 
    for file in files: 
     if file == '.' or file == '..': continue 
     path = dir + os.sep + file 
     if os.path.isdir(path): 
      nukedir(path) 
     else: 
      os.unlink(path) 
    os.rmdir(dir) 

nukedir("/home/mb/test"); 

Powyższa funkcja usunie dowolny katalog rekurencyjnie ...

+0

HI dzięki za odpowiedź, ale problem polega na tym, że chcę usunąć plik logu Weblogic za pomocą WLST z Pythan. – user1344022

+0

Wygląda na to, że powinien działać w przypadku katalogów, ale nie jest równoważny z 'rm -rf': powoduje błędy w przypadku próby usunięcia pojedynczego pliku. Najlepiej używać dobrze przetestowanego kodu ze standardowej biblioteki Pythona, kiedy to możliwe, zamiast pisać własne. Zobacz moją czteroliniową funkcję 'rm -rf' tutaj: http://stackoverflow.com/a/9559881/260491 –

+0

nie musisz pisać własnego. Standardowa biblioteka Pythona ma już plik shutil.rmtree(), który rekurencyjnie usuwa –

6

shutil jest twoim przyjacielem w tej instancji.

http://docs.python.org/2/library/shutil.html#shutil.rmtree

import shutil 
shutil.rmtree("/my/path/to/folder/to/destroy") 
+2

. Czy ktoś inny dostrzega tę ironię w tej zarozumiałej odpowiedzi, gdy najważniejszym wynikiem w Google jest to pytanie? – RussellStewart

+0

Chociaż przydatne, 'rmtree' nie jest równoważne: powoduje błędy przy próbie usunięcia pojedynczego pliku. Zobacz moją odpowiedź tutaj: http://stackoverflow.com/a/9559881/260491 –

0

można użyć modułu subprocess:

from subprocess import Popen, PIPE, STDOUT 

cmd = 'rm -frv /path/to/dir' 
p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True) 
out = p.stdout.read() 
print out 
+0

Przeglądam niektóre kod i programista użył podprocesu rm vs unlink. Najpierw używali unlink, a następnie przełączali się na 'subprocess.call (['rm', '-f', file_path])'. Po prostu próbuję zrozumieć, dlaczego to zrobili, a jeśli nastąpił wzrost wydajności? – radtek

4

Czy Twój serwer z systemem Linux, czy też jest to tylko przykład?

Na pytonie, shutil.rmtree() jest odpowiednikiem rm -r (jak już @Alex odpowiedział). Wszystkie komendy usuwania Pythona (os.unlink(), os.rmdir()) działają bez sprawdzania, więc zawsze są równoważne z rm -f.

Ale jeśli jesteś w systemie Windows, OS will not let you usuń plik, który wciąż jest otwarty; dostaniesz wyjątek. AFAIK nie ma nic, co może zrobić z tym nieuprawniony proces.

+0

HI alexis, mój serwer działa na komputerze z systemem Linux. Problem polega na tym, że nie mam pozwolenia na zalogowanie się jako użytkownik Weblogic. Tak więc logowałem się jako użytkownik, który nie ma uprawnień do usunięcia pliku dziennika Weblogic. Używam WLST z Pythan. Czy istnieje sposób usuwania plików za pomocą WLST. – user1344022

+0

Nie mam pojęcia, co to jest WLST lub Weblogic. Aby usunąć plik, musisz mieć możliwość uruchomienia _some_ programu w ramach procesu, który ma uprawnienia do jego usunięcia. Jeśli '' os.unlink() 'pytona nie może tego zrobić, nic nie możesz zrobić w _any_ języku programowania: system operacyjny nie pozwoli ci. – alexis

+0

Chociaż przydatne, 'rmtree' nie jest równoważne: powoduje błędy, jeśli spróbujesz usunąć pojedynczy plik. Zobacz moją odpowiedź tutaj: http://stackoverflow.com/a/9559881/260491 –

Powiązane problemy