Skocz do zawartości
januzi

python, linux, nadpisywanie plików

Rekomendowane odpowiedzi

Mam w skrypcie napisane coś takiego:

MyHandler.id=MyHandler.id+1
# zrob plik pdf do wydrukowania
plik = open("plik"+str(MyHandler.id)+".pdf","wb")
plik.write(base64.b64decode(post_data.decode('utf-8')));
plik.close();

 

Ogólnie działa bez większych problemów (przynajmniej pod windowsem). Natomiast na linuksie zawartość plików (o ile istnieją) nie jest nadpisywana. Właścicielem skryptu i plików jest ten sam użytkownik, więc uprawnienia nie powinny mieć tutaj nic do rzeczy (no, chyba, że jest selinux, ale on już od samego początku powinien blokować samo tworzenie plików).

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

A w kontekście jakiego użytkownika uruchamiany jest python?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

wszystko idzie przez roota (bo to domyślny użytkownik na puppy linuksie i nie miałem siły kopać się z koniem)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

No to ja się poddaję. Choć nie wiem jak python nadpisje pliki, może chodzi o prawa do katalogu nadrzędnego? Ale to już taki strzał bezradności Podobnie jak brak miejsca na dysku.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie jest nadpisywana w sensie:

-dopisuje na końcu

-wywala błąd otwarcia pliku

-wywala błąd pisania do pliku

Data modyfikacji pliku się zmienia?

 

Jeżeli to nic związanego ze skryptem, to mi jeszcze przychodzi do głowy problem buforów w systemie. Dla skryptu wszystko się wykonało jak należy ale modyfikacja siedzi tylko w buforze, nie została zrzucona na dysk.

U mnie (zupełnie inny przypadek - kopiowanie plików z nadpisaniem starych) niby wszystko było ok ale twardy reset rozwalał pliki, bo system czekał na zrzucenie buforów.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Mam w skrypcie napisane coś takiego:

MyHandler.id=MyHandler.id+1
# zrob plik pdf do wydrukowania
plik = open("plik"+str(MyHandler.id)+".pdf","wb")
plik.write(base64.b64decode(post_data.decode('utf-8')));
plik.close();

 

Ogólnie działa bez większych problemów (przynajmniej pod windowsem). Natomiast na linuksie zawartość plików (o ile istnieją) nie jest nadpisywana. Właścicielem skryptu i plików jest ten sam użytkownik, więc uprawnienia nie powinny mieć tutaj nic do rzeczy (no, chyba, że jest selinux, ale on już od samego początku powinien blokować samo tworzenie plików).

 

Przedstawiony skrypt działa bez problemu.

Może post_data się nie zmienia? Sprawdź to.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Data modyfikacji pliku jest wczorajsza. Skrypt odpala to, co jest po wklejonym przeze mnie fragmencie, więc raczej zakładam, że prawidłowo działa cała reszta.

Na razie dałem polecenie kasowania pliku o wskazanej nazwie, jeśli istnieje, i jakoś to hula. Dane na 100% idą za każdym razem nowe.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Próbowałeś debugować? Wszystkie dane, wraz z nazwą dla nowego pliku na pewno istnieją i są w poprawnej formie? Bez znajomości całej aplikacji trudno powiedzieć, ale być może środowisko linuxowe powoduje problem w innej części aplikacji, przez co dane potrzebne do stworzenia pliku nie są prawidłowe. W miarę możliwości i dowolnym sposobem sprawdź zawartość MyHandler.id i danych do pliku, przy uruchomieniu skryptu na Linuxie.

 

Edit: Nie doczytałem ostatniego posta. Usuwałeś plik podając dokładnie tą samą ścieżkę co przy tworzeniu? Jeśli tak to już nie mam pomysłów. Ewentualnie może być coś nie tak z danymi. A spróbuj zamiast tych danych wrzucić jakieś swoje dane testowe np. dowolnego stringa i zobacz czy plik się utworzy. Żeby znaleźć winowajcę niestety trzeba się czasem nakombinować. ;)

Edytowane przez Isharoth

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

No to będę musiał odpalić zapis logów do pliku, bo kasowanie też nie zadziałało.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Po testach wychodzi tak:

1. na Windowsie nie ma różnicy co i jak robimy, pliki tworzą i nadpisują się w katalogu roboczym ze skryptem

2. na Linuksie pliki tworzą się w katalogu roboczym, ale nadpisywanie nie chodzi, chyba, że zrobimy myk:

dir_path = os.path.dirname(os.path.realpath(__file__))
plik = open(dir_path+"/plik"+str(MyHandler.id)+".pdf","wb")

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...