Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: MaBo 26. 10. 2021, 21:43:22
-
Omlouvám se za dotaz začátečníka:
tohle funguje:
>>> def test(a):
... print(a*a)
...
Tohle v .py souboru nefunguje(PyCharm):
def test(a):
print(a * a)
Proč?
Moc díky za pomoc.
M.
-
Mně to funguje. Bude potřeba napsat co znamená nefunguje.
~> cat /tmp/a.py
def test(a):
print(a * a)
test(666)
~> py3 /tmp/a.py
443556
~>
-
./testdef.py
./testdef.py: řádek 1: chyba syntaxe poblíž neočekávaného tokenu „(“
./testdef.py: řádek 1: `def test(a):'
Někde hold dělám chybu, ale nevím kde.
M.
-
Jak to spoustis?
Ta hlaska vypada jako by to zkousel interpretovat shell(nebo cmd na windows) misto pythonu.
Mozna bude potreba pridat na zacatek souboru shebang (https://stackoverflow.com/questions/6908143/should-i-put-shebang-in-python-scripts-and-what-form-should-it-take (https://stackoverflow.com/questions/6908143/should-i-put-shebang-in-python-scripts-and-what-form-should-it-take))
nebo spoustet python a predat mu ten soubor jako argument a ne spoustet primo ten script.
edit: aha koukam pycharm... to by asi melo bejt chytry... ale stejne... jak to teda poustis?
-
mám tam
#!/usr/bin/python3
Je to ubuntu 20.10
buď
python testdef.py
nebo
./testdef.py
-
Jestli dobre ctu tu chybu tak to rika, ze na radku 1 mas "def test(a):" tak kde mas to #!/usr/bin/python3?
a je na te ceste opravdu ten python?
co vypise: "/usr/bin/python3 --version"?
a co "python --version"?
-
sh -vx ./testdef.py
#!/usr/bin/env python3
def test(a):
./testdef.py: 2: Syntax error: "(" unexpected
a není výstup, ale když zkusím mimo def x(), např. níže uvedené, tak to funguje
a = input("Zadej délku strany čtverce: ")
a = float(a)
o = a * 4
S = a ** 2
print("Obvod čtverce: ", o)
print("Obsah čtverce: ", S)
Jde o to, že neumím zprovoznit funkci.
-
To by moh bejt bordel v odsazení.
Chtělo by to vidět tu funkci v kontextu okolo.
-
Funkce je v poradku.
problem je ta exekuce.... ted sem to vyzkousel
Mam soubor testdef.py
#!/usr/bin/python
def test (a):
print (a * a)
test (5)
a tady vystup z konzole:
[lstpr@mframe tmp]$ sh -vx testdef.py
#!/usr/bin/python
def test (a):
testdef.py: line 2: syntax error near unexpected token `('
testdef.py: line 2: `def test (a):'
[lstpr@mframe tmp]$ python testdef.py
25
[lstpr@mframe tmp]$ chmod u+x testdef.py
[lstpr@mframe tmp]$ ./testdef.py
25
[lstpr@mframe tmp]$
Kdyz to spoustis tim sh -vx tak to ignoruje ten shebang.
Kdyby to byla chyba v tom pythonu tak to vypada trochu jinak. Napriklad:
File "/home/lstpr/tmp/./testdef.py", line 2
def test [a]:
^
SyntaxError: invalid syntax
-
/usr/bin/python3 --version
Python 3.9.7
...
python --version
Python 2.7.18
Tady jsou dvě verze, ale protože tomu nerozumím, nevím, jestli je to špatně nebo ne.
-
/usr/bin/python3 --version
Python 3.9.7
...
python --version
Python 2.7.18
Tady jsou dvě verze, ale protože tomu nerozumím, nevím, jestli je to špatně nebo ne.
Je to v poradku.
python 3 prinesl nejaky nekompatibilni zmeny takze spousta systemu potrebuje obe verze.
Zkus tomu souboru pridat to pravo na spusteni "chmod u+x testdef.py" a spustit ho primo "./testdef.py"
-
Nastavil jsem tedy chmod u+x testdef.py a v bash žádný výstup. Už před tím jsem to ale udělal i ručně a nemá to na exekuci žádný vliv.
-
kdybeste nam ukazal cely soubor, tak by byl problem davno vyresen.
-
sh -vx ./testdef.py
Tohle znamená, že to spouštíš shellem, nikoli Pythonem. sh je úplně jiný programovací (skriptovací) jazyk a funkce se v něm nedefinují pomocí def a dvojtečky na konci, takže to samozřejmě nefunguje.
Nastavil jsem tedy chmod u+x testdef.py a v bash žádný výstup.
Pokud je v tom souboru jenom definice funkce, ale žádný příkaz co by tu funkci spouštěl/co by něco vypisoval, tak logicky žádný výstup nebude.
-
Ten soubor je
#!/usr/bin/python
def test (a):
print (a * a)
exekuci provádím ./testdef.py. Čekal jsem, že se odřádkuje a já napíšu např. test(55) a vyjde výstup, ale dělám to asi špatně. Jaký je tedy správný postup pro exekuci .py souborů v bash?
-
Zruš mezeru mezi test a (5)
-
Zkoušel jsem zadat do tohotéž souboru i jiný z netu ukradený zdroják funkce, třeba
#!/usr/bin/python
def mocnina(m, n=3):
print(m**n)
a po ./testdef.py se nic neděje.
-
Zkoušel jsem zadat do tohotéž souboru i jiný z netu ukradený zdroják funkce, třeba
#!/usr/bin/python
def mocnina(m, n=3):
print(m**n)
a po ./testdef.py se nic neděje.
Protoze jsi tu funkci definoval, ale nezavolal.
-
Díky, a jak ji mám zavolat?
-
...
Čekal jsem, že se odřádkuje a já napíšu např. test(55) a vyjde výstup, ale dělám to asi špatně.
...
Tohle je chybne ocekavani...
bud si pustim python repl kam muzu psat to volani: python
nebo pustim program ktery je v souboru: python testdef.py
ale pak to jen probehne program a nic se nepocita/nezavola... protoze tam neni volani...
To co cekas se da udelat pomoci: python -i testdef.py
Coz znamena: spust mi python repl a naimportuj kod ze souboru testdef.py
-
Díky, a jak ji mám zavolat?
volani funkce je to: test(55) co chces psat rucne... muze to byt i primo v tom souboru:
#!/usr/bin/python
def test (a):
print (a * a)
test (55) # <- tohle je volani
-
Moc díky listoper a vlastně všem za pomoc. Psal jsem tu funkci špatně a nikde jsem se tohle nedočetl. To
#!/usr/bin/python3
def test(a):
print(a * a)
test(55)
i python -i testdef.py funguje. Jak mám tedy napsat fci v .py souboru, abych mohl v bash po ./tesdef.py zadat do test(...) libovolné číslo? Opravdu moc se omlouvám za ty dotazy; v manuálech na netu jsem se nic z toho, co jste tu napsali, nedočetl.
-
i python -i testdef.py funguje. Jak mám tedy napsat fci v .py souboru, abych mohl v bash po ./tesdef.py zadat do test(...) libovolné číslo?
Můžeš na začátek napsat
#!/usr/bin/env -S python3 -i
nebo
#!/usr/bin/python3 -i
Nicméně je to velmi nestandardní a nikdo to nedělá. Normálně se tohle řeší tak, že si pustíš ideálně ipython (což lidi používají mnohem raději než vestavěný REPL bez funkcí) a napíšeš from testdef import test.
-
Moc díky listoper a vlastně všem za pomoc. Psal jsem tu funkci špatně a nikde jsem se tohle nedočetl. To
#!/usr/bin/python3
def test(a):
print(a * a)
test(55)
i python -i testdef.py funguje. Jak mám tedy napsat fci v .py souboru, abych mohl v bash po ./tesdef.py zadat do test(...) libovolné číslo? Opravdu moc se omlouvám za ty dotazy; v manuálech na netu jsem se nic z toho, co jste tu napsali, nedočetl.
Ty chces v bash zavolat fukci kterou mas definovanou v pythonu....
Myslim, ze tvuj zivot bude jednodussi kdyz to chtit nebudes ;)
Myslim, ze jsou lepsi cesty....
Co treba takhle:
#!/usr/bin/python
import sys
def test (a):
return (a * a)
if __name__ == "__main__":
arg = sys.argv [1]
print(test (int (arg)))
pak to muzu volat z bash takhle:
./testdef.py 5
a 5 vymen za libovolne cislo...
-
Moc díky listoper! Opravdu moc.
Takže jestli to správně chápu, tak musím nastudovat, jak vlastně python iniciuje skripty; zatím o tom vím kulový. Ale jestli máš ještě čas, mohl bys mi vysvětlit
if __name__ == "__main__":
arg = sys.argv [1]
print(test (int (arg)))
-
Moc díky listoper! Opravdu moc.
Takže jestli to správně chápu, tak musím nastudovat, jak vlastně python iniciuje skripty; zatím o tom vím kulový. Ale jestli máš ještě čas, mohl bys mi vysvětlit
if __name__ == "__main__":
arg = sys.argv [1]
print(test (int (arg)))
Pokud voláš modul jako program, pak je podmínka splněna a spustí se ten blok. Bežně se to tedy používá, pokud chceš aby modul fungoval i jako program. V podstatě tak funguje dost balíků/modulů v zakladní knihovně. Např. modul `venv`, který by ses určitě měl naučit používat. Python spustí modul venv a předá mu parametr `virtual_env_name`.
```
python -m venv virtual_env_name
```
Mrkni třeba tady: https://github.com/python/cpython/blob/82a662e5216a9b3969054c540a759a9493468510/Lib/venv/__init__.py#L503
a dokumentace https://docs.python.org/3/library/__main__.html
-
uetoyo:
Tak tímhle jsem měl začít. Škoda, že tohle není popsáno v manuálech hned v lekcích o zápisech funkcí.
Moc díky.
-
Moc díky listoper! Opravdu moc.
Takže jestli to správně chápu, tak musím nastudovat, jak vlastně python iniciuje skripty; zatím o tom vím kulový. Ale jestli máš ještě čas, mohl bys mi vysvětlit
if __name__ == "__main__":
arg = sys.argv [1]
print(test (int (arg)))
uetoyo to rika dobre.
Zkusim to vysvetlit jeste selsky...
Tohle if __name__ == "__main__": rika pokud je tenhle soubor spustenej jako program a ne treba importnutej nejakym jinym souborem....
Diky tomu ze to tam napises muzes tehle soubor primo spustit, ale i importovat jinym programem ktery chce taky pouzit funkci test....
Protoze v tom pripade ten vyraz bude false a:
arg = sys.argv [1]
print(test (int (arg)))
se nevykona takze tam zustane jen ta definice te funkce... a ne nejake nechtene vypisy na stdout
-
listoper:
Neocenitelné rady. Díky.