Van egy egyszerű python3 scriptem a while ciklushoz, csak ennyi:
#!/usr/bin/env python3
while True:
s = input('Kérdés')
Elmentettem egy fájlba, amit futtathatóvá tettem.
Ha így futtatom:
python3 whilex.py akkor rendben lefut.
de ha így ./whilex.py akkor hibaüzenetet kapok, hogy nincs ilyen fájl vagy könyvtár.
Ez miért van? Egyszerűen nem értem mi a baja.
- 2354 megtekintés
Hozzászólások
chmod +x whilex.py
megvolt?
- A hozzászóláshoz be kell jelentkezni
Láttam a screenshotodból, hogy nem ez. A 3 byte-tal hosszabb fájl árulkodott.
Lássuk:
cat >> teszt.py
#!/usr/bin/env python3
while True:
s = input('Kérdés')
chmod +x teszt.py
./teszt.py
le fog futni
todos teszt.py # ennek hatására #!/usr/bin/env python3\r lesz
./teszt.py
: Nincs ilyen fájl vagy könyvtár
nem fog lefutni.
Körüljártam egyúttal még jobban: kivettem az "env"-et, "#!/usr/bin/python3\r" maradt rejtett dos-os \r-rel, és lefuttattam:
./teszt.py
bash: ./teszt.py: /usr/bin/python3^M: rossz parancsértelmező: Nincs ilyen fájl vagy könyvtár
Mennyivel beszédesebb ez a hibaüzenet.
Érdekes problémára világítottál rá, ami más szkriptnyelvnél is #!/usr/bin/env xxxx esetén problémát okozhat. Köszi.
- A hozzászóláshoz be kell jelentkezni
Nincs mit! Igazság szerint nem is csináltam volna ebből topicot, csak azt hittem én vagyok a hülye, hogy a script Python3 IDLE-ben működik, parancssorban meg nem. Az eltérő méret miatt nem gondoltam karakterkódolási hibára, azt hittem csak azért nem egyezik a méret, mert az egyikben több Enter-t ütöttem.
- A hozzászóláshoz be kell jelentkezni
Miféle screenshot és miféle 3 byte?
Netán UTF-8 BOM?
- A hozzászóláshoz be kell jelentkezni
Nem, hanem a kocsivissza (CR) a sorok végén, amit WinDos-ban tett oda.
- A hozzászóláshoz be kell jelentkezni
A héten jártam én is így, egy levélben kiküldött script fájllal. Csak nem futott le a fogadó félnél. Aztán meglett hogy ez a probléma :/
KAMI | 神
Firefox OS: https://is.gd/fxoshu Linux Mint: https://linuxmint.hu LibreOffice: http://libreoffice.hu SeaMonkey : http://is.gd/smhun
Legyél Te is Mozilla és Linux Mint önkéntes
- A hozzászóláshoz be kell jelentkezni
probald igy:
#!/usr/bin/python3
Ha nincs jol beallitva a PATH, az env ossze-vissza mukodhet
- A hozzászóláshoz be kell jelentkezni
Ilyet még nem láttam. Olyan mintha ez a fájl sérült volna. De hogy lehet sérült egy 3 soros szövegfájl?
Nem számít ha átnevezem, ha másolom, ha kicserélem a parancsokat, ez a fájl nem fut le. De ha létrehozok egy másik fájlt és copy-zom parancsokat, az meg lefut. Megáll az eszem.
- A hozzászóláshoz be kell jelentkezni
rmcr, dos2unix vagy hasonló kellene
- A hozzászóláshoz be kell jelentkezni
Igazából nem érdekel tovább, mert ez bug, de ha valaki nem hiszi, itt egy kép róla:
https://onedrive.live.com/?cid=0290852993448AC9&id=290852993448AC9!3233…
- A hozzászóláshoz be kell jelentkezni
Adj a hibásról egy strace és ltrace kimenetet. Nálam rendben volt.
- A hozzászóláshoz be kell jelentkezni
Miért nem ugyanakkora a két fájl mérete?
- A hozzászóláshoz be kell jelentkezni
No, a megoldás az lesz, amit a többiek is feszegetnek itten. Ha valamiért \n helyett \r\n van a sorok végén (windows alatt lett mentve?)
Emiatt a bash az első sort úgy értelmezi, hogy a python3\r nevű környezeti változót akarod kiszedni, ami értelemszerűen nincs, ezért is írja neked, hogy ":command not found" (látod a kettőspontot, előtte volna a parancs amit próbált futtatni)
Megoldás: Konvertáld át hogy a sorvégződések ne windowsosak legyenek :)
- A hozzászóláshoz be kell jelentkezni
Az az igazság, hogy az eredeti fájl a coded nevű WP8 alkalmazásban készült.
Akkor ezek szerint ez karakterkódolási hiba. Hogy tudom átkonvertálni? Hogy lehet ezt elkerülni? Mert ez így elég gáz.
Ezen a linken megtalálható:
https://onedrive.live.com/?cid=0290852993448AC9&id=290852993448AC9!1689…
- A hozzászóláshoz be kell jelentkezni
Nyisd meg mcedit-ben (Midnight Commander Editor).
Nyomj itt egy F12-öt és válaszd 'Sortörés formátum: Unix formátum' -ot.
Katt az OK-ra, és kész is vagy...
Ezután Linux -programozáshoz Linux alkalmazást (lehetőleg konzolosat) használj, szerintem.
- A hozzászóláshoz be kell jelentkezni
Vagy az editorconfigot, valamelyik általa támogatott szerkesztővel.
- A hozzászóláshoz be kell jelentkezni
Köszönöm. Kipróbálom. Bár gondolom, ilyen konvertálást, bármelyik editor tud. Jobb szeretném ezt a problémát megelőzni.
Ezután Linux -programozáshoz Linux alkalmazást (lehetőleg konzolosat) használj, szerintem.
Egyelőre még csak ismerkedem a python-nal, így a Python IDLE-t használom elsősorban. Innen is jött a probléma, mert ott működött a script, konzolon meg nem.
- A hozzászóláshoz be kell jelentkezni
fromdos teszt.py
Levágja a sorvégi \r -eket.
- A hozzászóláshoz be kell jelentkezni
Hogy lehet ezt elkerülni?
Ez nettó figyelmetlenség. Persze el is kerülhető, ha a UNIX-on futtatandó scripteket UNIX-on szerkesztgeted, és nem küldözgeted át Windows-ra/ról...
- A hozzászóláshoz be kell jelentkezni
Félig adnék igazat, én őszintén szólva nem értem hogy ennyi év után még mindig létezik ez a probléma, amire figyelni kell. Miért volna olyan nehéz linuxnak tudni a \r-ről, windowsnak pedig lekezelni a \r hiányát?
- A hozzászóláshoz be kell jelentkezni
Én az elvre nem jöttem rá. Ha az órán nekem azt mondta a tanár tollbamondáskor, hogy új sor, akkor a sor elején kezdtem írni.
Valaki tudja, miért alakult ki a történelem során az MS-féle kocsivissza+újsor? Tehát a technikatörténet során miért lett a kétféle rendszer?
- A hozzászóláshoz be kell jelentkezni
Ha logikai szempontból vizsgálod, van értelme a CR LF-nek, csak pazarlás. Például írsz egy terminálos alkalmazást, ahol rendszeres időközönként ki kell írnod, hány százaléknál tart a folyamat. Itt csak CR-re van szükséged LF nélkül, mert a kurzort a sor elejére viszed, majd ugyanazt a sort kell felülírnod.
Mondjuk az LF értelme CR nélkül valóban vitatható, nem tartom életszerűnek, hogy a következő sorban ugyanattól a vízszintes pozíciótól folytassunk valamit. Lényegében éppen ezt használja ki a GNU/Linux. A CR-t valóban CR-ként, azaz kurzor sor elejére küldéseként értelmezi, míg az LF-be beleért egy CR-t is, tehát valójában CR LF-et csinál.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Valaki tudja, miért alakult ki a történelem során az MS-féle kocsivissza+újsor? Tehát a technikatörténet során miért lett a kétféle rendszer?
Ez volt előbb. A nyomtató számára a "menjünk vissza a sor elejére" egy önálló művelet, a "tekerjünk a papíron felfele" egy másik. Mind a kettőre szükség lehet magában, és pl. a mátrix nyomtatókon lehet is használni (minek mozgassuk a fejet, ha nem muszáj, mert egymás alá akarunk nyomtatni, ha meg rá akarunk nyomtatni ugyanarra a sorra megint, akkor meg kell a CR is).
Az LF-only tudtommal a UNIX-ot és a C nyelvet kitalálók "egyszerűsítése" volt.
- A hozzászóláshoz be kell jelentkezni
UNICS 1969 (még assembly-ben írva) és Kernighan-Ritchie féle C 1972.
MSDOS 1981
Melyik őstől örökölhette a CR+LF kombinációt az MSDOS, mert hogy nem a UNICS-tól az LF-et az biztos.
És egy jövőbemutató gondolat:
- vajon mikor lesz mindenhol egységesen CR (azonos sor felülírása) és az újsorra egyetlen LF (újsor) karakter?
- vajon mikor lesz mindenhol egységesen UTF8 a 7 bites ASCII karaktereken túlmutató karakterekre?
- A hozzászóláshoz be kell jelentkezni
Szerintem nem a Unix-hoz van köze, hanem a soros terminálok és nyomtatók világához, valamint az ASCII-kódokhoz. Nézd meg az ASCII táblázat 0-0x1F tartományát, a vezérlőkódok jelentését. Abból nagyon érződik, hogy az akkoriban szokásos technológiát szolgálta ki. Az UTF-8 felvetése jogos, bár ez csak egy unicode implementáció, a gyakorlatban talán a legcélszerűbb. Ugyanakkor unicode-ot lehet más módon, például UTF-16, vagy UTF-32 kódolással ábrázolni. A CR LF nem egyszerű, mert bár logikus a Unix szokásos eljárása, valójában éppen ez a csalás, a tömörítés. Igazán tisztességesen ki kellene írni a CR LF-et, tekintve azok eredeti, ASCII jelentését, más kérdés, hogy manapság ezt meghaladta a kor.
Én nem szoktam beleszaladni efféle hibába, mert azok után, hogy egy valami.xls nevű html file-lal találkoztam egykoron, óvatos vagyok, tanultam a figyelmetlenségemből, s ha valami nem stimmel, azonnal megnézem file
paranccsal illetve hex viewerrel is a file-t.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Itt kicsit jobban kifejtik:
https://en.wikipedia.org/wiki/Newline#History
- A hozzászóláshoz be kell jelentkezni
Egyrészt soha, másrészt kb ugyanakkor.
Egyébként az nem igaz, hogy 'unixon nincs CR', csak az, hogy a 'unixos texfájlokban nincs CR'. De amikor a terminállal kommunikálunk, akkor nagyon is van.
Az utf8 kb akkor lesz univerzális, ha a mindenki, aki most utf16-ot használ, gyorsan átáll. Ilyenek pl: MS Windows, Java, Oracle, IBM AIX... Szóval én még nem várom holnapra.
- A hozzászóláshoz be kell jelentkezni
Örökölhette pl. a CP/M-ből is. Csakúgy, mint sok minden mást.
Fuszenecker Róbert
- A hozzászóláshoz be kell jelentkezni
A Windows-ról nem tudok nyilatkozni, de a 'Notepad-nál feljebb' kategóriájú szövegszerkesztők (pl Notepad++, EditPad) felismerik, hogy nincs a fájlban LF, és nem erőltetik bele.
- A hozzászóláshoz be kell jelentkezni
Szerintem CR-t akartál írni...
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Stimmel;)
- A hozzászóláshoz be kell jelentkezni
Ha igazán ügyes lenne az env, írhatna egy figyelmeztetést, hogy "python3\r nincs, csak python3"
Vagy úgy kell beállítani a verziókövetőt (mivel nem említette a kolléga, feltételezem, hogy most nem használt), hogy Windowson windowsos soremeléssel vegye ki a fájlokat, Linuxon linuxossal.
Fuszenecker Róbert
- A hozzászóláshoz be kell jelentkezni
Karakterkódolás, sorvégek?
MD5-sum egyezik?
- A hozzászóláshoz be kell jelentkezni