Permalänk
Testpilot

Behöver lite hjälp med python

Har suttit ett tag och kodat ett litet script i python som ska ladda upp två filer till en hemsida med hjälp av http post. har kommit så långt att man anropar scriptet på det här sättet:

script.py fil1.txt fil2.txt

då laddas fil1.txt och fil2.txt upp och alla är nöjda och glada. Ett problem är att om man utelämnar nån av dom två argumenten får man felet IndexError: list index out of range då jag hämtar argumenten med argv[1] och argv[2]. Hur fixar jag en koll för det som bara kolla om dom är satta men inte försöker läsa från dom? har prövat med if not argv[1] men får samma fel.

Har även ett annat problem, jag skulle vilja göra ett script som tar en mapp som argument och i den mappen söker reda på en speciell filtyp, säg att jag har tio mappar och i varje mapp ligger det massor av filer men bara en av filtypen jpeg, skriptet ska då kunna ta vilken som helst av dom tio mapparna som argument och varje gång kunna hitta just jpeg-filen oavsett vad den heter.

Det sista problemet jag har är att jag har laddat ner ett bibliotek i form av en py-fil men jag fattar inte hur jag ska kunna inkludera den så att mitt script fattar att biblioteket finns, måste jag installera allt tills pythons huvudbibliotek på något sätt?

Är jättetacksam för svar, behöver inte vara kompletta lösningar, lite hjälp på traven uppskattas det med

Visa signatur

Kolla gärna in min RGB-LED-ljusstake i galleriet
[Gigabyte GA-Z97MX-Gaming 5][Intel Core i5 4690K][Corsair XMS3 16GB][Asus GeForce RTX 2060 Super Dual Evo OC]

Permalänk

Inte för att jag kan Python, men du kan ju kolla om argv[1] finns.

if argv[1].empty? # Göra saker. end

Det funkar i Ruby.

Permalänk
Medlem

Testat len(argv)?

os.listdir kanske kan hjälpa dig med det andra problemet..

Antingen så får du lägga tredjepartsbibliotek i samma mapp som ditt eget projekt och bara importera som vanligt eller läsa dokumentationen för biblioteket efter instruktioner på hur det ska installeras på den plattformen du kör.

Permalänk
Medlem

Från manualen:

argv
The list of command line arguments passed to a Python script. argv[0] is the script name (it is operating system dependent whether this is a full pathname or not). If the command was executed using the -c command line option to the interpreter, argv[0] is set to the string '-c'. If no script name was passed to the Python interpreter, argv has zero length.

Prova:

import sys print "Arg","Len="+str(len(sys.argv)) for arg in sys.argv: print arg raw_input()

Om du bara vill ha filnamnen så använd:

for arg in sys.argv[1:]: print arg

/BK

Permalänk
Testpilot

Tack e5150 och bk2003, hade testat med len(argv[0]) utan att det funkade men med bara len(argv) löste det sig, då kan jag kolla så den innehåller tre värden.

Visa signatur

Kolla gärna in min RGB-LED-ljusstake i galleriet
[Gigabyte GA-Z97MX-Gaming 5][Intel Core i5 4690K][Corsair XMS3 16GB][Asus GeForce RTX 2060 Super Dual Evo OC]

Permalänk
Medlem

Om du behöver lite mer avancerade/flexibla argument till dina script så kolla på getopt-modulen:
http://docs.python.org/lib/module-getopt.html
eller ännu mer i optparse: http://docs.python.org/lib/module-optparse.html

Ditt första problem skulle du även kunna löst genom att lagt koden som skapar felet i ett try-except block: http://docs.python.org/tut/node10.html try-except kommer du säkert använda i framtiden oxå, så det är värt o lära sig även om det hade varit en ful lösningen i just det här fallet

Permalänk
Glömsk
Citat:

Ursprungligen inskrivet av hunden
Tack e5150 och bk2003, hade testat med len(argv[0]) utan att det funkade men med bara len(argv) löste det sig, då kan jag kolla så den innehåller tre värden.

argv[0] är en textsträng som innehåller sökvägen till programmet. Längden på detta är alltså längden på textsträngen, där längden på argv är antal element i listan.

En annan lösning är exceptions.

try:
print argv[1000]
except IndexError:
print "nu blev nått fel"

Visa signatur

...man is not free unless government is limited. There's a clear cause and effect here that is as neat and predictable as a law of physics: As government expands, liberty contracts.

Permalänk
Testpilot

Jag läste om try-except igår när jag hade problem med det och försökte använda det, fick samma felmeddelande ändå om out of range.

Psionicist: Menade egentligen att jag försökte med len(argv[1]) och fick då felmeddelandet. 0:an funkade, skrev fel bara

Visa signatur

Kolla gärna in min RGB-LED-ljusstake i galleriet
[Gigabyte GA-Z97MX-Gaming 5][Intel Core i5 4690K][Corsair XMS3 16GB][Asus GeForce RTX 2060 Super Dual Evo OC]

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av hunden
Jag läste om try-except igår när jag hade problem med det och försökte använda det, fick samma felmeddelande ändå om out of range.

Psionicist: Menade egentligen att jag försökte med len(argv[1]) och fick då felmeddelandet. 0:an funkade, skrev fel bara

Det är för att du försöker kolla längden på det första argumentet. Om du inte har något första argument så blir det såklart en exception.

Du ska skriva t.ex.

import sys if len(sys.argv) < 3: #programnamn + 2 argument print "too few arguments" sys.exit(1)

exceptions funkar också bra som sagt

import sys try: filnamn1 = sys.argv[1] filnamn2 = sys.argv[2] except IndexError: print "too few arguments" sys.exit(1)

Permalänk
Testpilot

Jom len(argv) löste det som sagt så det är inga problem med det längre. Fick även exceptions att funka till slut, måste ha gjort nått fel innan bara

En liten sak jag inte får att funka är att efter jag gjort om mitt script till en exe-fil med py2exe skulle jag kunna vilja dra filer till det och på så sätt ladda upp dom. Vad jag testat så verkar inte ett drag-n-drop räknas som ett vanligt argument, hur kommer jag åt sökvägen till det som droppades?

Edit: Hmm, verkade ju visst funka som ett vanligt argument bara det att Windows skiter i att lägga på "-tecken runt sökvägen och då funkar det inte. Hur kan man kolla om sökvägen innehåller två "-tecken och om den inte gör det så lägger man till dom?

Edit2: endswith och startswith verkar vettigt kanske

Visa signatur

Kolla gärna in min RGB-LED-ljusstake i galleriet
[Gigabyte GA-Z97MX-Gaming 5][Intel Core i5 4690K][Corsair XMS3 16GB][Asus GeForce RTX 2060 Super Dual Evo OC]