Τα πάντα για την Python

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

Re: Τα πάντα για την Python

Δημοσίευσηαπό Ilias95 » 26 Ιαν 2012, 17:38

Ναι για testing το θέλω. Δεν νομίζω ότι είναι σωστό να μπουν στον root συνήθως υπάρχει υποκατάλογος tests και εκτός αυτού είναι και περισσότερα από ένα αρχεία.
Το πρώτο που προτείνει ο pmav δουλεύει γενικώς, τα imports γίνονται αλλά υπάρχει πρόβλημα με τα tests.

Έστω ότι η δομή είναι:
Κώδικας: Επιλογή όλων
app\
__init__.py
run_tests.py
tests\
__init__.py
test_something.py


Με τον πρώτο τρόπο πρέπει να τρέξω το test_something μέσα από το run_tests. Προσπαθώντας να το κάνω αυτό με:
Κώδικας: Επιλογή όλων
#run_tests.py

from tests import test_something
test_something.unittest.main()

θα εκτελεστούν 0 tests. Δηλαδή δεν θα εκτελεστεί κανένα απ' τα tests του test_something.py.
Υπάρχει τρόπος να εκτελέσω τα tests ενός module μέσα από κάποιο άλλο; Ή μήπως πρέπει να γίνει κάπως αλλιώς;

Με τον 2ο τρόπο εξακολουθώ να μην μπορώ να το κάνω να δουλέψει. Παίρνω:
Κώδικας: Επιλογή όλων
ValueError: Attempted relative import in non-package
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό sokoban4ever » 28 Ιαν 2012, 06:33

:problem:
Μα γιατί δεν σου δουλεύει ;
1)είσαι σίγουρος ότι διάβασες καλά τι λέει στο stackoverflow;
2) στο http://www.python.org/dev/peps/pep-0328/ κοίταξες....;

Off topic:
P.S
(κάτι σαν να λέμε με lustrex λουστηκες .... :lol:
λολ κάνουμε που που και αστειάκια :P
Sorry :oops: :angel:
Θέλουμε και μπορούμε να έχουμε μια καλύτερη ζωή και όσο θα ζούμε θα προσπαθούμε να την αποκτήσουμε ακόμα και αν πεθάνουμε προσπαθώντας, και αν κάποια στιγμή λιγίσουμε έχουμε το επίπεδο να πούμε κουράστηκα λίγο να ,να ξαποστάσουμε , ώστε να συνεχίσουμε πάλι δυνατοί ξανά.

Μήνυμα με αγάπη και αληλλεγγύη σε όλους τους ανθρώπους από όλους τους λαούς , ιδίως του Ελληνικού.
Άβαταρ μέλους
sokoban4ever
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 2331
Εγγραφή: 13 Φεβ 2009, 02:22
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό pmav99 » 28 Ιαν 2012, 12:02

Για tests δεν ξέρω δεν το έχω χρησιμοποιήσει ποτέ έτσι. Με nose ή με κάτι τέτοιο το έχεις δοκιμάσει?
pmav99
seniorTUX
seniorTUX
 
Δημοσιεύσεις: 574
Εγγραφή: 05 Ιούλ 2008, 14:29
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό Ilias95 » 28 Ιαν 2012, 13:30

sokoban4ever έγραψε: :problem:
Μα γιατί δεν σου δουλεύει ;
1)είσαι σίγουρος ότι διάβασες καλά τι λέει στο stackoverflow;
2) στο http://www.python.org/dev/peps/pep-0328/ κοίταξες....;

Off topic:
P.S
(κάτι σαν να λέμε με lustrex λουστηκες .... :lol:
λολ κάνουμε που που και αστειάκια :P
Sorry :oops: :angel:

Φαντάζομαι αναφέρεσαι στην 2η περίπτωση.

1) Σίγουρα δεν διάβασα καλά τι λέει γιατί αν είχα διαβάσει δεν θα είχα πρόβλημα. :P Το θέμα είμαι τι δεν διαβάζω/καταλαβαίνω σωστά.
2) Ναι. Έχω δημιουργήσει ακριβώς την δομή που έχει στην Guido's Decision.
Τρέχω όλα τα παραδείγματα που έχει από κάτω και παίρνω συνεχώς:
Κώδικας: Επιλογή όλων
ValueError: Attempted relative import in non-package

Κάτι μου ξεφεύγει. :(
Δοκίμασες μήπως το παραπάνω; Δούλεψε σωστά;

Off topic:
Ps. :lol:
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό Ilias95 » 28 Ιαν 2012, 13:34

pmav99 έγραψε:Για tests δεν ξέρω δεν το έχω χρησιμοποιήσει ποτέ έτσι. Με nose ή με κάτι τέτοιο το έχεις δοκιμάσει?

Δεν θέλω να χρησιμοποιήσω κάτι άλλο θα αρκεστώ στο unittest.
Εντάξει δεν είναι και τόσο μεγάλο πρόβλημα το ότι δεν μπορώ να τα τρέξω από άλλο module. Έτσι κι αλλιώς νομίζω το σωστό είναι να τρέχει το κάθε αρχείο με τα tests ξεχωριστά.
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό pmav99 » 28 Ιαν 2012, 15:06

Ηλία, ανέβασε αν θες zip-αρισμένο το folder structure που χρησιμοποιείς για να ξέρουμε γιατί μιλάμε.

Χρησιμοποιώντας το structure του Guido, λογικά στα moduleX, moduleY, moduleZ, moduleA πρέπει να βάλεις "from __future__ import absolute_imports". Μετά όταν κανεις import μέσα από ένα module του πακέτου ένα άλλο πακέτο, θα χρησιμοποιείς relative imports. Τα παραδείγματα του Guido δηλαδή θα τρέχουν. Προσοχή όμως. Δεν μπορείς να πας να τρέξεις απευθείας το moduleX πχ. Θα πρέπει να πας έξω από το πακέτο και να δώσεις from package.subpackage1 import moduleX.

Τα relative imports παίζουν μόνο εντός ενός package και τα πακέτα τα χρησιμοποιείς μόνο κάνοντάς τα import από άλλα scripts. Κάτι τέτοιο έχω καταλάβει εγώ τουλάχιστον.
pmav99
seniorTUX
seniorTUX
 
Δημοσιεύσεις: 574
Εγγραφή: 05 Ιούλ 2008, 14:29
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό Ilias95 » 28 Ιαν 2012, 15:51

pmav99 έγραψε:Τα relative imports παίζουν μόνο εντός ενός package και τα πακέτα τα χρησιμοποιείς μόνο κάνοντάς τα import από άλλα scripts. Κάτι τέτοιο έχω καταλάβει εγώ τουλάχιστον.

Ναι, όντως. Τώρα το κατάλαβα και το έκανα να δουλέψει. Το "from __future__ import absolute_import" δεν πρέπει να χρειάζεται στην python 2.7. Είναι για εκδόσεις μικρότερες της 2.6.
Όπως είπες όμως πρέπει να χρησιμοποιήσεις τα πακέτα κάνοντας τα import από άλλο, εξωτερικό script. Οπότε δεν μου κάνει. :P

Αλλά είναι δυνατόν να μην υπάρχει ένας απλός, όμορφος τρόπος να κάνω import ένα module που βρίσκεται ένα επίπεδο πάνω χωρίς να χρειάζεται να μπλέξω 3ο script; :P
Το sys.path.append('..') σίγουρα είναι "άσχημη" λύση, αλλά δεν βλέπω άλλη εναλλακτική.
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό sokoban4ever » 28 Ιαν 2012, 19:36

@Ilias95
Βασικά το sys.path.append('..') νομίζω ότι δεν είναι και τόσο "άσχημη" λύση για ένα-δυό imports ...

αλλα για να μας λυθούν οι απορίες ας συγκρίνουμε τι εννοεί ο καθένας..... ;)


Λοιπόν (από ότι κατάλαβα ότι έλεγες έχουμε και λέμε)

0) έχουμε αυτη την δομή φακέλων
Spoiler: show
Κώδικας: Επιλογή όλων
sokoban@Laptop:~/Desktop/TESTS$ tree
.
└── app
├── __init__.py
├── run_tests.py
└── tests
├── __init__.py
└── test_something.py

2 directories, 4 files


και αν συγκριμένα ισχύουν
1) τα __init__.py είναι άδεια
2) εκτελείς το run_test.py μέσα από το φάκελο app , δηλαδή το sys.path[0] = /home/username/some/folder/app
3) το run_test.py κάνει from tests import test_somthing
Spoiler: show
Κώδικας: Επιλογή όλων

from tests import test_something
import sys

print " ' from tests import test_something' --> OK "

test_something.TFUNC()

print " ' Call test_something.TFUNC ' --> OK"

print "\nsys.path[0] --> " , sys.path[0] ,"\n"

4)και το test_something.py έχει κάποια συνάρτηση στο namespace του

Spoiler: show
Κώδικας: Επιλογή όλων
__name__ = "test_something"

def TFUNC():
print "Succesfully executed test_something.FUNC from module ", __name__


5) εκτελώ από το φάκελο app το run_tests.py
και το αποτέλεσμα είναι
Spoiler: show
Κώδικας: Επιλογή όλων
' from tests import test_something' --> OK
Succesfully executed test_something.FUNC from module test_something
' Call test_something.TFUNC ' --> OK

sys.path[0] --> /home/sokoban/Desktop/TESTS/app

Μήπως δεν έχεις κάνει την __name__ σε test_something ; :problem:
αν δεν το έχεις κάνει
τότε τι ακριβώς έχεις κάνει;
Θέλουμε και μπορούμε να έχουμε μια καλύτερη ζωή και όσο θα ζούμε θα προσπαθούμε να την αποκτήσουμε ακόμα και αν πεθάνουμε προσπαθώντας, και αν κάποια στιγμή λιγίσουμε έχουμε το επίπεδο να πούμε κουράστηκα λίγο να ,να ξαποστάσουμε , ώστε να συνεχίσουμε πάλι δυνατοί ξανά.

Μήνυμα με αγάπη και αληλλεγγύη σε όλους τους ανθρώπους από όλους τους λαούς , ιδίως του Ελληνικού.
Άβαταρ μέλους
sokoban4ever
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 2331
Εγγραφή: 13 Φεβ 2009, 02:22
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό Ilias95 » 28 Ιαν 2012, 20:14

@sokoban4ever
Φαντάζομαι πλέον αναφέρεσαι σε αυτό το post: viewtopic.php?p=227050#p227050
Αυτό που λέω για τα tests είναι άσχετο με τη δομή των φακέλων. Αυτό που προσπαθούσα να κάνω είναι να τρέξω ένα test (unittest) μέσα από άλλο module.

Έστω ότι έχω στον ίδιο φάκελο τα αρχεία test_simple.py και run_tests.py.
Κώδικας: Επιλογή όλων
#test_simple.py

import unittest

class Simple(unittest.TestCase):
def test_basic_addition(self):
"""Tests that 1 + 1 always equals 2"""
self.assertEqual(1 + 1, 2)

if __name__ == '__main__':
unittest.main()

Κώδικας: Επιλογή όλων

#run_tests.py

import test_simple
test_simple.unittest.main()

Τα εκτελώ και τα δύο μέσα απ' τον φάκελο που βρίσκονται. Δεν έχει σημασία άλλωστε εδώ.

Φυσικά αν εκτελέσω το test_simple.py θα πάρω σαν έξοδο:
Spoiler: show
Κώδικας: Επιλογή όλων
.
----------------------------------------------------------------------
Ran 1 test in 0.002s

OK

Το test έτρεξε κανονικά και μάλιστα πέρασε.

Αν τρέξω το run_test.py όμως η έξοδος θα είναι:
Spoiler: show
Κώδικας: Επιλογή όλων
----------------------------------------------------------------------
Ran 0 tests in 0.000s

OK

Δηλαδή το test δεν εκτελέστηκε! Φαντάζομαι ο λόγος είναι ότι ψάχνει για tests στο run_tests.py και φυσικά δεν υπάρχουν.

Αυτό είναι το πρόβλημα με τα tests.
Το πρόβλημα με τα imports είναι άλλο, ανεξάρτητο: viewtopic.php?p=226976#p226976
Edit: Στο παράδειγμα σου δεν νομίζω ότι χρειάζεται η __name__.
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό sokoban4ever » 28 Ιαν 2012, 20:57

Ilias95 έγραψε:@sokoban4ever
Φαντάζομαι πλέον αναφέρεσαι σε αυτό το post: viewtopic.php?p=227050#p227050

Ναι σωστά φαντάστηκες σε εκείνο το post αναφερώμουν
όχι η __main__ χρειάστηκε για να τρέξει..

ωραία λοιπόν στο run_tests.py
στην main του unittest βάλε για default argument στην main
module=όνομα του module (Αφού το κάνεις import)
δηλαδή
Κώδικας: Επιλογή όλων

#run_tests.py

import test_simple

test_simple.unittest.main(module=test_simple)

(φυσικά το δοκίμασα και αυτό πριν το postάρω και δούλεψε :thumbup: )

περισσότερα στο
http://docs.python.org/library/unittest ... ttest.main
Ελπίζω να βοήθησα :)

That's all Follks :)

Spoiler: show

:P
:lol: :lol: :lol: :lol: :lol: :lol:

Θέλουμε και μπορούμε να έχουμε μια καλύτερη ζωή και όσο θα ζούμε θα προσπαθούμε να την αποκτήσουμε ακόμα και αν πεθάνουμε προσπαθώντας, και αν κάποια στιγμή λιγίσουμε έχουμε το επίπεδο να πούμε κουράστηκα λίγο να ,να ξαποστάσουμε , ώστε να συνεχίσουμε πάλι δυνατοί ξανά.

Μήνυμα με αγάπη και αληλλεγγύη σε όλους τους ανθρώπους από όλους τους λαούς , ιδίως του Ελληνικού.
Άβαταρ μέλους
sokoban4ever
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 2331
Εγγραφή: 13 Φεβ 2009, 02:22
Εκτύπωση

ΠροηγούμενηΕπόμενο

Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι