Radosław Napisano Czerwiec 30, 2020 Zgłoszenie Share Napisano Czerwiec 30, 2020 witam Piszę sobie programik, który z ułatwi mi zarządzanie pakietami. Python, GUI Tkintera itd. Ale natknąłem się na problem. Chcę aby instalacja pakietu była potwierdzana/przerywana przyciskami w gui Instaluj/Przerwij. Myślę, że uda mi się to rozwiązać za pomocą przechwytywania linii z subprocess.Popen tylko, że pojawił się nastepny problem. gdy przekazuję hasło dla sudo -S czy to przez potok echo "password" | dnf -S install pakiet czy przez sudo -S <<< "password" dnf -S install pakiet to gdzieś tam pojawia się enter i na pytanie t/N się automatycznie wciska przerywając instalację. Nie mam możliwości wybrania tak. dodanie -n do echo nie rozwiązało problemu. Szukam takiego problemu w necie, ale czyżbym tylko ja tak miał? ten sam efekt jest gdy np chcemy coś usunąć z pomocą sudo: echo "password" | sudo -S rm -i /root/plik-w-katalogu-roota Coś będę kombinował z kdesu, ale powyższe jest dla mnie zastanawiające. Ktoś coś może pomóc? Pozdrawiam Radosław Głębicki Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
andrew Napisano Lipiec 2, 2020 Zgłoszenie Share Napisano Lipiec 2, 2020 echo -n "Ala" nie daje znaku końca wiersza (parametr -n) więc problem chyba gdzie indziej Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Radosław Napisano Lipiec 2, 2020 Autor Zgłoszenie Share Napisano Lipiec 2, 2020 dlatego napisałem, że nie pomaga zastosowanie, bo myślałem, że echo daje "return", ale to nie to. Czy ktoś wie jak w pythonie użyć modułu dnf i coś w pythonie przez dnf zainstalować. Szukam jakiegoś poradnika i ciężko. Jeden był, ale jak czytałem to mi głowa puchła. Coś prostego, łopatologicznie: dnf.rozkaz(pakiet) i już. W wyżej wymienionym programie doszedłem do takiej "ściany przedstawiania efektu pracy programu" Jak się instaluje w terminalu za pomocą dnf install pakiet to dostajemy ładne paski postępu. Potrafię przechwycić linie i umieścić w gui tkinter. Nawet zabrałem się za przechwytywania znaków (read(1) w odróżnieniu od readline dla całych linii) i za chiny nie mogę wyłapać postępu w terminalu, aby przenieść go do gui. A taki wget i postęp tam wyłapuję. Co jest z postepem w dnf gdzie on idzie, ani stdout, ani errout. Nawet jak chcemy w terminalu przekierować do pliku to nic się nie pojawia. Na jakim poziomie on działa - ten postęp? Pozdrawiam Radek Głębicki Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
andrew Napisano Lipiec 2, 2020 Zgłoszenie Share Napisano Lipiec 2, 2020 Może spróbuj użyć API https://dnf.readthedocs.io/en/latest/api.html Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Radosław Napisano Lipiec 2, 2020 Autor Zgłoszenie Share Napisano Lipiec 2, 2020 no wyobraź sobie, że właśnie na tamtej stronie rozbolała mnie głowa. A jeszcze mam alergię na programowanie obiektowe. Za dużo "self". Tam jak widzę: dfn install pakiet a poniżej 50 linii kodu, które jak rozumiem robią to samo, to pozostanę przy subproces.Popen('dnf install pakiet' ...... A te 50 linii jeszcze wymaga dodania czegoś, aby działało bo copy, paste and run nie daje efektu. To nie mój poziom. Mój program ma już prawie 1000linii i 29tyś znaków i żadnej klasy. Ja wywodzę się z basic i c i z tym pozostanę. Może ktoś to "zwinąć" do paru liniii w pythonie odpowiadających np pakiet httpd "dnf install httpd"? Pozdrawiam Radek Głębicki PS: dzięki za podpowiedź Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Radosław Napisano Lipiec 2, 2020 Autor Zgłoszenie Share Napisano Lipiec 2, 2020 import dnf if __name__ == '__main__': with dnf.Base() as base: # Repositories serve as sources of information about packages. base.read_all_repos() # A sack is needed for querying. base.fill_sack() # A query matches all packages in sack q = base.sack.query() # Derived query matches only available packages q_avail = q.available() # Derived query matches only installed packages q_inst = q.installed() print(q_inst,'#########################') available = q_avail.run() for pkg in q_inst.run(): if pkg not in available: print(str(pkg)) Takie coś tam było. Kurczę, co to jest rozbijam sobie to na kawałki w konsoli pythona . Same obiekty. Przecież tkinter, a nawet qt5 nie jest tak pokręcone. To jest API dnf to ja dziękuję. Kosmos. Pozdrawiam Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Radosław Napisano Lipiec 4, 2020 Autor Zgłoszenie Share Napisano Lipiec 4, 2020 Udało mi się znaleźć rozwiązanie mojego problemu paska postępu przy przechwytywaniu wyjścia dnf. W komendzie pythona subprogress.Popen trzeba dodać rozkaz pv z pakietu pv. Wygląda to tak: 'sudo -S <<< "<password>" dnf --assumeyes install httpd | pv -n 2>&1 | cat' i wtedy przy odczycie stdout z Popen mamy jakiś ruch, lecą jakieś znaki, a to możemy przenieść jako progres do tkinter progressbar. Nie jest to idealny progres bo nie ma % postępu, ale przynajmniej wiadomo, że program coś robi. Może się komuś przyda. Pozdrawiam Radek Głębicki Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Rekomendowane odpowiedzi
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ę