Czy to błąd subprocess czy ja robię coś źle?

Czy to błąd subprocess czy ja robię coś źle?
RG
  • Rejestracja:około 5 lat
  • Ostatnio:około 10 godzin
  • Lokalizacja:Sardine, Italy
  • Postów:187
0

działa
s_wyn=subprocess.check_output('dnf list ', shell=True)
wywala błąd: Command 'dnf check-update' returned non-zero exit status 100
s_wyn=subprocess.check_output('dnf check-update ', shell=True)

Python 3.7.3

Myślę, że to błąd modułu subprocess

cały błąd:
File "/usr/lib64/python3.7/subprocess.py", line 395, in check_output
**kwargs).stdout
File "/usr/lib64/python3.7/subprocess.py", line 487, in run
output=stdout, stderr=stderr)
wg: pip list --outdated
mam aktualne
Czy może to ktoś sprawdzić u siebie?

Aaa czy używać subprocess.check_output() czy os.sytem()

Dziwi mnie forma odpowiedzi dnf check-update w terminalu:
jest dwulinijkowa z aktualnym i nowym pakietem, ale jak przekażemy do less to robią się tylko nowe.
Może to to? Dodatkowo śledziłem wątek na bugzilli o dnf z błędem który mi przeszkadzał. Oczywiście trzeba było zaktualizować pakiet dnf i to co było źle to działa. Ale w tym zaktualizowanym znalazłem podobny błąd w innej części.
Używam Fedory 30 i tam:
dnf repolist all
jest ok, ale już przekierowanie do less
daje bałagan. Czyli potoki odpadają. I to poprawiono przy normalnym dnf list bo też był bałagan. dnf repolist all zostało niepoprawione.
Bugzilla 584525

JV
co masz na myśli przez to, że less daje bałagan?
RG
Ale czad. To jest właśnie przykład manipulacji: Cytat: "...less daje bałagan" -> Oryginał: "Przekierowanie do less daje bałagan." Tak działają media ;-D
RG
  • Rejestracja:około 5 lat
  • Ostatnio:około 10 godzin
  • Lokalizacja:Sardine, Italy
  • Postów:187
0

Nie less tylko przekierowanie do less. Potoki odpadają.

JV
  • Rejestracja:ponad 6 lat
  • Ostatnio:3 miesiące
  • Postów:242
0

szkoda że nie widać na obrazku jaka komenda jest wywoływana, ale mniejsza z tym. Być może w w grę wchodzą jakieś kody sterujące np. ANSI dla kolorów. Poza tym jeżeli wynik less jest nimi zabałaganiony to zwykle pomaga less -R, ale chyba z tym nie ma tu problemu.

Programy które ślą do stdout potrafią sprawdzić czy tam jest terminal czy pipe. Może dnf bada to oraz uzyskuje maksymalną liczbę kolumn terminala podłączonego do stdout i wtedy skraca zbyt długie linie. Wydaje mi się, że argument shell=True może mieć na to wpływ, który tak na marginesie z tego co pamiętam jest podatny na shell injection.

enedil
nie jest podatny, bo argument nie jest z inputu, tylko jest ustalony (mianowicie dnf list)
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Ale czego ty się spodziewasz skoro less jest interaktywną komendą? o_O


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
RG
  • Rejestracja:około 5 lat
  • Ostatnio:około 10 godzin
  • Lokalizacja:Sardine, Italy
  • Postów:187
0

Jaka komenda jest wywoływana podałem w pierwszym poście. Tam nawet jest bug dnf-a z bugzilli, ale tyczy sie parametru list, a nie został poprawiony repolist all. Ja proszę jedynie o weryfikację subprocess.check_output('dnf check-update'.....

enedil
  • Rejestracja:prawie 12 lat
  • Ostatnio:15 dni
  • Postów:1027
0

Co do tych pomysłów, to są nieco nieeleganckie. Listowanie wszystkiego robi się tak:

Kopiuj
from dnf.cli import dnf
base = dnf.Base()
base.read_all_repos()
base.fill_sack()
q = base.sack.query()
for package in q.available():
    print(package)

Warto generalnie wiedzieć, że dnf jest napisany w Pythonie.

Edit: upgrades analogicznie, robisz to co powyżej, a potem

Kopiuj
print(list(q.upgrades().available()))
edytowany 2x, ostatnio: enedil
RG
wiem, że jest moduł do "dnfownia", ale wolę się uczyć przez zabawę idąc okrężną drogą. np: cat /etc/yum.repos.d/* do stringa, string do listy, analiza linia po linii, a po działaniach uzyskuję słownik z kluczem name-id i resztą jako słownik w słowniku(swoją drogą niezły bajer- zagnieżdżone słowniki): 1 rpm fedora fedora-cos tam cos tam 0 rpm-md opera opera-cos tam c-s tam itd Zabawa w obróbkę tekstów/stringów/list itp
enedil
No to nie sądzisz, że używanie w tym celu outputu polecenia nie jest szczególnym krokiem w tym celu? Bo np. na podstawie listy repozytoriów, nie pobierasz sobie indeksu i nie przetwarzasz pobranych danych
JV
  • Rejestracja:ponad 6 lat
  • Ostatnio:3 miesiące
  • Postów:242
0
Radosław Głębicki napisał(a):

Jaka komenda jest wywoływana podałem w pierwszym poście. Tam nawet jest bug dnf-a z bugzilli, ale tyczy sie parametru list, a nie został poprawiony repolist all. Ja proszę jedynie o weryfikację subprocess.check_output('dnf check-update'.....

Oto moja weryfikacja, poniższy skrypt nie wywalił żadnego błędu:

Kopiuj
#!/usr/bin/env python3
import subprocess
s_wyn=subprocess.check_output('dnf check-update', shell=True)
print(s_wyn.decode('utf-8'))

Edit: taki jeszcze mały research:
$ dnf repolist all - sprawdza liczbę kolumn terminala (tput cols) i dopasowuje szerokość kolumn
$ dnf repolist all | less - zakłada szerokość 80 kolumn, więc jak teminal ma mniej to wynik less się rozjedzie

edytowany 2x, ostatnio: jvoytech
RG
to na końcu wiem dlatego nie da się w pipe posłać bo się rozwala. to samo było przy list ale poprawili. Jeśli chodzi o subprocess to nie ma róznicy. dalej to samo. ja jedynie używam .decode('utf-8") za subprocess, ale bez różnicy. Jaką wersję pythona? Zakładam ze dnf w linuksie testowałeś jaka dystrybucja?
JV
  • Rejestracja:ponad 6 lat
  • Ostatnio:3 miesiące
  • Postów:242
0

to na końcu wiem dlatego nie da się w pipe posłać bo się rozwala. to samo było przy list ale poprawili. Jeśli chodzi o subprocess to nie ma róznicy. dalej to samo. ja jedynie używam .decode('utf-8") za subprocess, ale bez różnicy. Jaką wersję pythona? Zakładam ze dnf w linuksie testowałeś jaka dystrybucja?

wersja pythona 3.7.7

instalowałem VMke pierwszą z brzegu vagrant init generic/fedora30 więc to chyba fedora30. Sprawdziłem tak na szybko grep 80 **/* w katalogu /usr/lib/python3.7/site-packages/dnf i jeden z wyników cli/term.py ma takie coś w sobie:

Kopiuj
def _term_width(fd=1):
    """ Compute terminal width falling to default 80 in case of trouble"""
    tw = _real_term_width(fd=1)
    if not tw:
        return 80
    elif tw < 20:
        return 20
    else:
        return tw

czyli jeżeli stdout nie jest terminalem a pipe-em to liczba kolumn będzie równa 80 co oczywiście sprawia, że less ma poobcinane wiersze. Więc przydała by się opcja dla dnf, żeby automatycznie dopasowywał sobie liczbę kolumn do najdłuższej komórki, albo może jakieś zawijanie wierszy? Najlepiej by było zwracać np. -1 i tam gdzie jest to wykorzystywane obliczyć na bieżąco na podstawie aktualnych danych.

Tak na szybko to można w linii 3 fd=1 zamienić na fd=0 czyli stdin. Nie sądzę aby ta komenda przyjmowała cokolwiek ze standardowego wejścia, albo było kolejnym elementem w potoku ... | dnf ... | ..., więc można by założyć że będzie zawsze terminalem. Sprawdziłem i less już nie ma poobcinanych wierszy, ale nie nazwałbym tego poprawnym rozwiązaniem. Trzeba by dalej pogrzebać w kodzie i wymyślić coś sprytniejszego.

enedil
  • Rejestracja:prawie 12 lat
  • Ostatnio:15 dni
  • Postów:1027
1

Ale to nawet nie jest kwestia lessa, i to nawet nie jest kwestia subprocess, u mnie na Fedorze 31 (normalnie używanej, nie na vagrancie), mam podobnie, jak w terminalu uruchomię check-update, kod wyjścia to 100.

Nie jest to bug, jak spojrzysz w manual, to zobaczysz taką sekcję:

Kopiuj
   Check-Update Command
       dnf [options] check-update [--changelogs] [<package-file-spec>...]
          Non-interactively checks if updates of the specified packages are available. If no  <package-file-spec>
          is  given,  checks  whether any updates at all are available for your system. DNF exit code will be 100
          when there are updates available and a list of the updates will be printed, 0 if not and 1 if an  error
          occurs.  If  --changelogs  option is specified, also changelog delta of packages about to be updated is
          printed.
edytowany 1x, ostatnio: enedil
JV
Wychodzi na to, że już wszystko się wyjaśniło. Trzeba łapać wyjątek z subprocess.check_update, a z krzakami w less zrobić jak podałem wcześniej, a najlepiej zgłosić to jako bug i niech developerzy się martwią nad poprawnym rozwiązaniem
RG
no, ale czy to nie oznacza, że subprocess sobie z czymś nie radzi gdy są zwracane określone dane? File "/usr/lib64/python3.7/subprocess.py", line 395, in check_output **kwargs).stdout File "/usr/lib64/python3.7/subprocess.py", line 487, in run output=stdout, stderr=stderr) W terminalu działa, a subprocess się wysypuje.
enedil
nie, nie znaczy
enedil
  • Rejestracja:prawie 12 lat
  • Ostatnio:15 dni
  • Postów:1027
0
Kopiuj
Signature: subprocess.check_output(*popenargs, timeout=None, **kwargs)
Docstring:
Run command with arguments and return its output.

If the exit code was non-zero it raises a CalledProcessError.  The
CalledProcessError object will have the return code in the returncode
attribute and output in the output attribute.

Zgodnie z dokumentacją, dostajesz wyjątek.

RG
Ale ten sam rozkaz w terminalu nie generuje wyjątku. Zwraca listę danych. A subprocess nie. To gdzie jest problem?
enedil
W tym że to jest oczekiwane zachowanie, i nie rozumiesz że jest oczekiwane
RG
No ale dlaczego subprocess nie potrafi przetworzyć dnf check-update. Co jest oczekiwanego w wysypywaniu się programu w module na jakiejś linii. Jak rozumieć to co zwraca? Robię inaczej. Działa jak przez os.system dnf check-update >plik a plik odczytam i już. Dla mnie to jest błąd subprocess i tyle. Dzięki.
RG
ok. mam skumałem. to jest błąd dnf check-update. a jedynie subprocess nie wie co zrobić z błędem. zrobiłem w subprocess ls nieistniejącego katalogu i też mam błąd non-zero exit status. No ale jak obsłużyć taki błąd jak odczytać wartość przez try: jak?
RG
a dnf zwraca 100 bo to oznacza że są nowe aktualizacje. Chyba temat zamknięty.
enedil
dnf check-update tak po prostu działa, zwraca 100 jak są aktualizacje. Nic w tym a priori błędnego. Cieszę się, że nieco się rozjaśniło.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)