Συζήτηση
Γεια χαρά, Επισκέπτης
Όνομα χρήστη: Κωδικός: Να με θυμάσαι

ΘΕΜΑ: Δομή πακέτων σε ένα Python project.

Δομή πακέτων σε ένα Python project. 6 Χρόνια 10 Μήνες πριν #4916

  • Tassos
  • Το Άβαταρ του/της Tassos
  • Αποσυνδεμένος
  • pyth__
  • g-lts.info
  • Δημοσιεύσεις: 78
  • Ληφθείσες Ευχαριστίες 5
Χαιρετώ την αγαπητή κοινότητα.

Έχω μπερδευτεί λιγάκι στην Python3 με την κατασκευή πακέτων ( packages ).
Θέλω σε ένα πρόγραμμα να έχω ένα κοινό πακέτο λογισμικού όπου εκεί μέσα θα έχω ας πούμε διάφορες συναρτήσεις τις οποίες να μπορώ να κάνω import σε άλλα πακέτα.

π.χ. έχω την παρακάτω δομή :

my_project
├── common
│   ├── a_utility.py
│   └── __init__.py
├── functionality_1
│   ├── create_something.py
│   └──__init__.py
├── functionality_2
│   ├── create_something_else.py
│   └──__init__.py
├── __init__.py
└── main.py

Αν πάω όμως να κάνω στο αρχείο πηγαίου κώδικα «create_something.py» το εξής import :

from my_project.common import a_utility

Μου βγάζει αυτό το σφάλμα :
ImportError: No module named 'my_project.common'

Γιατί συμβαίνει αυτό; Δε μπορώ να το κάνω ; Αν μπορώ, πως;

Υ.Σ. : Συγκεκριμένα, αυτό μου συμβαίνει σε ένα Django application στο οποίο θέλω να έχω δύο εφαρμογές οι οποίες θα έχουν μικρές διαφορές μεταξύ τους. Ως εκ τούτου ένα σύνολο βοηθητικών συναρτήσεων που έχω κατασκευάσει θέλω να είναι προσβάσιμες και προς χρήση σε περισσότερες από μία εφαρμογές.
( Επειδή κάθε εφαρμογή - application στο Django είναι σαν ένα διαφορετικό πακέτο στο ίδιο project για αυτό ανάγω το πρόβλημα στο παραπάνω απλούστερο ώστε να μην σας μπερδεύω με την Django. Πιστεύω πως είναι το ίδιο - μπορεί να κάνω και λάθος - )

Ευχαριστώ πολύ για τον χρόνο σας. :)

Edit : Δουλεύω με την Python 3.5.3 & Django 2.0 .
Ομάδα Ελληνικής - Μακροχρόνιας υποστήριξη.

Greek - Long Term Support Team.

Επισκεφθείτε μας εδώ : g-lts.info
Τελευταία διόρθωση: 6 Χρόνια 10 Μήνες πριν από Tassos. Αιτία: Προσθήκη σημαντικών πληροφοριών.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Δομή πακέτων σε ένα Python project. 6 Χρόνια 10 Μήνες πριν #4917

  • Αποστόλης
  • Το Άβαταρ του/της Αποστόλης
  • Αποσυνδεμένος
  • pytho_
  • Δημοσιεύσεις: 148
  • Ληφθείσες Ευχαριστίες 24
Αν υποθέσουμε οτι τα path είναι δηλωμένα σωστά στο settings.py, μάλλον το λάθος είναι εδώ:
from my_project.common import a_utility
Νομίζω πως το my_project. κάτι χρησιμοποιείται σε παλιές versions του Django.
Στις νεότερες θέλει απλώς
from my_project import a_utility
Ψάξε λίγο να δεις τι παίζει με τις versions.
Τελευταία διόρθωση: 6 Χρόνια 10 Μήνες πριν από Αποστόλης.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Δομή πακέτων σε ένα Python project. 6 Χρόνια 10 Μήνες πριν #4918

  • embryo
  • Το Άβαταρ του/της embryo
  • Αποσυνδεμένος
  • pyth__
  • Δημοσιεύσεις: 92
  • Ληφθείσες Ευχαριστίες 31
Το λάθος, νομίζω, είναι ότι προσπαθείς να κάνεις import κάτι (my_project.common) από το my_project φάκελο, ενόσω βρίσκεσαι στον functionality_1 φάκελο (από το create_something.py)

Η λύση μπορεί να είναι να προσθέσεις πρώτα το εξωτερικό φάκελο (my_project) στο path του create_something.py

import sys 
sys.path.append('..')

και μετά να κάνεις το
from my_project.common import a_utility
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Δομή πακέτων σε ένα Python project. 6 Χρόνια 10 Μήνες πριν #4919

  • Tassos
  • Το Άβαταρ του/της Tassos
  • Αποσυνδεμένος
  • pyth__
  • g-lts.info
  • Δημοσιεύσεις: 78
  • Ληφθείσες Ευχαριστίες 5
Καταρχήν, σας ευχαριστώ και τους δύο για την άμεση απάντηση!
Ξέχασα να σας αναφέρω πως χρησιμοποιώ την έκδοση 2.0 του Django ( την εντελώς τελευταία - αν και θεωρώ πως δε παίζει ρόλο αυτό )

Δυστυχώς παιδιά κανένας από τους παραπάνω τρόπους δεν λειτουργεί. Εξακολουθώ να παίρνω το ίδιο σφάλμα.
Έχω δοκιμάσει ακόμη και αυτό :

from ..common.a_utility import a_function

Αλλά παίρνω το εξής σφάλμα :
ValueError: attempted relative import beyond top-level package

:(
Ομάδα Ελληνικής - Μακροχρόνιας υποστήριξη.

Greek - Long Term Support Team.

Επισκεφθείτε μας εδώ : g-lts.info
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Δομή πακέτων σε ένα Python project. 6 Χρόνια 10 Μήνες πριν #4921

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
Η python χρησιμοποιεί directories (φακέλους) για να δημιουργήσει την δομή των packages. Για να θεωρήσει η python ότι ένας φάκελος είναι ένα package, πρέπει μέσα σε αυτόν τον φάκελο να υπάρχει ένα αρχείο με το όνομα: __init__.py (Βάζεις 2 underscores και μπροστά από το όνομα και πίσω από το .py!!! Δηλαδή _ _ init _ _.py χωρίς τα κενά).

Το πρώτο package ονομάζεται top level package. Δηλαδή αν έχεις μια δομή:
(Τα ονόματα που ξεκινούν με ' / ' είναι φάκελοι, ενώ τα άλλα απλά αρχεία)
/sounds
   __init.py__
   foo.py
   /wavs
      __init.py__
      wav.py

ο φάκελος sounds είναι το top level.

Για να χρησιμοποιήσεις το wav.py:
from sounds.wavs import wav

ή
import sounds.wavs.wav

Εσύ λογικά παίρνεις το σφάλμα ImportError: No module named 'my_project.common'

Γιατί ξέχασες να βάλεις ένα άδειο αρχείο __init__.py στο top level directory (Δηλαδή στον φάκελο my_project). Αν δεν στο διορθώσει αυτό, πρέπει να μας στείλεις όλο το project να δούμε τι γίνεται.

Αν θες να μάθεις περισσότερα από packaging πες μου να σου πω περισσότερα!
Τελευταία διόρθωση: 6 Χρόνια 10 Μήνες πριν από babaliaris1.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Δομή πακέτων σε ένα Python project. 6 Χρόνια 10 Μήνες πριν #4922

  • embryo
  • Το Άβαταρ του/της embryo
  • Αποσυνδεμένος
  • pyth__
  • Δημοσιεύσεις: 92
  • Ληφθείσες Ευχαριστίες 31
Tassos έγραψε:
Δυστυχώς παιδιά κανένας από τους παραπάνω τρόπους δεν λειτουργεί. Εξακολουθώ να παίρνω το ίδιο σφάλμα.
Αυτό είναι πολύ περίεργο γιατί εδώ δουλεύει...
Εννοείται ότι πρέπει να έχεις βάλει __init__.py αρχεία στους φακέλους (όπως σου λέει και ο @babaliaris1)
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Δομή πακέτων σε ένα Python project. 6 Χρόνια 10 Μήνες πριν #4923

  • Tassos
  • Το Άβαταρ του/της Tassos
  • Αποσυνδεμένος
  • pyth__
  • g-lts.info
  • Δημοσιεύσεις: 78
  • Ληφθείσες Ευχαριστίες 5
Παιδιά, εννοείται πως έχω σε όλους του φακέλους "__init__.py" αρχεία.

@babaliaris1 γιατί έσβησες το προηγούμενο σχόλιό σου; Μήπως έχει αλλάξει όντως κάτι στις τελευταίες εκδόσεις της python σχετικά με τα πακέτα;

Τι να πω, λέτε να φταίει κάτι που να έχει να κάνει με το Django ; :/
Ομάδα Ελληνικής - Μακροχρόνιας υποστήριξη.

Greek - Long Term Support Team.

Επισκεφθείτε μας εδώ : g-lts.info
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Δομή πακέτων σε ένα Python project. 6 Χρόνια 10 Μήνες πριν #4924

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
Tassos έγραψε:
Παιδιά, εννοείται πως έχω σε όλους του φακέλους "__init__.py" αρχεία.

@babaliaris1 γιατί έσβησες το προηγούμενο σχόλιό σου; Μήπως έχει αλλάξει όντως κάτι στις τελευταίες εκδόσεις της python σχετικά με τα πακέτα;

Τι να πω, λέτε να φταίει κάτι που να έχει να κάνει με το Django ; :/

Το έσβησα γιατί έκανα λάθος, δεν άλλαξε τίποτα.
Μπορείς να μας στείλεις το project?
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Δομή πακέτων σε ένα Python project. 6 Χρόνια 10 Μήνες πριν #4925

  • Tassos
  • Το Άβαταρ του/της Tassos
  • Αποσυνδεμένος
  • pyth__
  • g-lts.info
  • Δημοσιεύσεις: 78
  • Ληφθείσες Ευχαριστίες 5
Παιδιά, δε θα το πιστέψετε..
Ενώ χρησιμοποιώ κιόλας την Professional έκδοση του PyCharm IDE της JetBrains έφταιγε αυτός.
Μου δημιούργησε αυτό το τρομερά σπαστικό πρόβλημα και με έφερε πίσω για το τίποτα. Συγκεκριμένα ο Pycharm αν έκανα :

from project.common.a_utility import a_function

Δε δε μου επισήμανε κανένα απολύτως πρόβλημα πριν τρέξω το Django project. Όταν όμως έτρεχα το Django project, στο τερματικό χτυπούσε το πρόβλημα που σας ανέφερα.


Δοκίμασα λοιπόν να κάνω το εξής :
from common.a_utility import a_function

και τώρα ο PyCharm IDE μου επισημαίνει πως σε αυτή την γραμμή υπάρχει πρόβλημα..
Unresolved reference 'common' more... (Ctrl+F1)
αλλά αν τρέξω το Django project μου ( από το τερματικό όπως πάντα ) όλα πηγαίνουν μια χαρά! Οπότε ο PyCharm IDE φταίει για αυτό τον τρομερό αποπροσανατολισμό και το μπλέξιμο!!

Απαράδεχτο, δε το περίμενα! Όμως δε μπορώ να το πιστέψω κιόλας για τον PyCharm. Μήπως πρέπει να κάνω κάποια ρύθμιση ρε παιδιά;

Εσείς ποιον άλλον IDE χρησιμοποιείται ;

Σας ευχαριστώ πάρα πολύ για τον χρόνο σας παιδιά & με συγχωρείτε που σας τρέλανα και εσάς.. (φανταστείτε εγώ πόσο τρελάθηκα με αυτή την βλακεία :P )
Ομάδα Ελληνικής - Μακροχρόνιας υποστήριξη.

Greek - Long Term Support Team.

Επισκεφθείτε μας εδώ : g-lts.info
Τελευταία διόρθωση: 6 Χρόνια 10 Μήνες πριν από Tassos.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Δομή πακέτων σε ένα Python project. 6 Χρόνια 10 Μήνες πριν #4926

  • Αποστόλης
  • Το Άβαταρ του/της Αποστόλης
  • Αποσυνδεμένος
  • pytho_
  • Δημοσιεύσεις: 148
  • Ληφθείσες Ευχαριστίες 24
Τέλος καλό όλα καλά. :)
Πάντως έχε πάντα κατά νου οτι το Django αντιμετωπίζει ελάχιστα διαφορετικά το θέμα με τα paths.
Εσύ βέβαια έπεσες στην περίπτωση. Δεν έχω δουλέψει το PyCharm συγκεκριμένα αλλά όντως ορισμένα IDE's αντιμετωπίζουν τα paths με τον δικό τους τρόπο. Το έχω δει κι εγώ στο Netbeans.

Όσον αφορά τα IDE εγώ για python (και τις περισσότερες γλώσσες) χρησιμοποιώ editors.
Geany στο Linux και Notepad++ στα Windows. Μόνο για Java χρησιμοποιώ το Netbeans.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Οι ακόλουθοι χρήστες είπαν "Σε Ευχαριστώ": Tassos

Δομή πακέτων σε ένα Python project. 6 Χρόνια 10 Μήνες πριν #4927

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
Εγώ χρησιμοποιώ τον idle που σε δίνει η python με την εγκατάσταση. Είναι πολύ απλώς και αρκετός για python.

Γενικά εγώ πιστεύω, η python δεν χρειάζεται τρομερά idles σαν το pycharm.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Οι ακόλουθοι χρήστες είπαν "Σε Ευχαριστώ": Tassos

Δομή πακέτων σε ένα Python project. 6 Χρόνια 10 Μήνες πριν #4928

  • Theo
  • Το Άβαταρ του/της Theo
  • Αποσυνδεμένος
  • pytho_
  • Δημοσιεύσεις: 249
  • Ληφθείσες Ευχαριστίες 70
Εγώ χρησιμοποιούσα την community edition και δεν είχα κανένα πρόβλημα τώρα ξεκίνησα με το vscode

Mάλλον το πρόβλημα δεν είναι ο pycharm αλλά να κατανοήσεις λίγο το base_path

Το base_path είναι ο εξωτερικός φάκελλος του project αυτός που δεν έχει init μέσα, έχει μόνο το manage.py ή και την database db.sqlite3 αν άφησες τις βασικές ρυθμίσεις. Αυτόν λοιπόν τον φάκελο δεν τον αναφέρεις καθόλου στα import σου καθόσον δεν έχει init

Μπορείς να αναφέρεσαι σε όλα τα apps και στον βασικό κατάλογο του project που έχουν μέσα init απευθείας
δηλαδή from project_name.settings import TEMPLATES
from app1 import views, urls, forms, models κλπ

Αν δεν το έπιασες ξαναρώτα
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Οι ακόλουθοι χρήστες είπαν "Σε Ευχαριστώ": Tassos

Δομή πακέτων σε ένα Python project. 6 Χρόνια 10 Μήνες πριν #4929

  • Tassos
  • Το Άβαταρ του/της Tassos
  • Αποσυνδεμένος
  • pyth__
  • g-lts.info
  • Δημοσιεύσεις: 78
  • Ληφθείσες Ευχαριστίες 5
Καταρχήν σας ευχαριστώ όλους που μοιράζεστε την άποψη σας με όλους μας.

Ίσος όντως το πρόβλημα μου είναι πως δεν έχω κατανοήσει κάτι πλήρως σε αυτό που αναφέρεις εσύ ως «base_path» στο Django.
To django project μου πάντως έχει ας πούμε την παρακάτω δομή :

my_project
|
├── db.sqlite3
│
├── __init__.py
│
├── manage.py
│
├── application_1
│
├── application_2
│
├── common
│
└── my_project
    │
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

Οπότε αυτό που λες εσύ πως ο αρχικό κατάλογος δεν έχει «__init__.py» αρχείο, σε εμένα δεν ισχύει ( και δε νομίζω να το έχω βάλει εγώ χειροκίνητα ).

Πάντως όντως ( το αναφέρω και παραπάνω ) τον κατάλογο του έργου δεν τον αναφέρω στα imports και έτσι λειτουργούν όλα μια χαρά.

Άλλο που για κάποιο χαζό λόγο ο PyCharm IDE ( όπως προαναφέρω ) μου βγάζει το error που μου βγάζει - και λειτουργεί μια χαρά ( μου τα συμπληρώνει και αυτόματα κιόλας )
μονάχα αν συμπεριλάβω και τον αρχικό κατάλογο του έργου.

Όμως όντως καθώς έψαχνα για αυτό το πρόβλημα κάποιος - κάπου έλεγε πως θα πρέπει ίσος να ρυθμιστεί στο pycharm project που έχεις ανοιχτό τον source folder ή κάτι τέτοιο, μάλλον αυτό που θες να πεις και εσύ σαν base path. Και νομίζω έλεγε πως αυτή η ρύθμιση γίνεται στο
«File -> Settings -> Project Structure» , αλλά δε το κοίταξα εκτενέστερα και δεν το έκανα ποτέ.

Όσο για το τελευταίο που λες φίλε, δε σε πιάνω, αν μπορείς ξανά πες το.
Ομάδα Ελληνικής - Μακροχρόνιας υποστήριξη.

Greek - Long Term Support Team.

Επισκεφθείτε μας εδώ : g-lts.info
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Δομή πακέτων σε ένα Python project. 6 Χρόνια 10 Μήνες πριν #4931

  • Theo
  • Το Άβαταρ του/της Theo
  • Αποσυνδεμένος
  • pytho_
  • Δημοσιεύσεις: 249
  • Ληφθείσες Ευχαριστίες 70
Λογικά το project σου στον εξωτερικό φάκελο θα έπρεπε να έχει μέσα μόνο το manage.py

docs.djangoproject.com/en/2.0/intro/tutorial01/
Let’s look at what startproject created:
 
mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        wsgi.py
 

είναι από το documentation του django 2

To manage.py είναι το βασικό εργαλείο διαχείρισης του project από αυτό τρέχεις server κάνεις superuser, migrations migrate shell κλπ θα παρατήρησες ότι χωρίς αυτό το django δεν λειτουργεί
μέσα σε αυτό ορίζεται και σαν μεταβλητή περιβάλλοντος για το django το project_name.settings

Πολλές φορές οι IDE δημιουργούν διάφορα περιέργα
H community edition του pycharm δεν υποστήριζει web frameworks οπότε ίσως γιαυτό δεν μου έκανε διάφορα περίεργα και σε εσένα κάνει

Το μπέρδεμα νομίζω γίνεται γιατί υπάρχει packet μέσα σε packet :blink: :S :whistle:
Τελευταία διόρθωση: 6 Χρόνια 10 Μήνες πριν από Theo. Αιτία: Μπέρδεμα
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Δομή πακέτων σε ένα Python project. 6 Χρόνια 8 Μήνες πριν #5073

  • Tassos
  • Το Άβαταρ του/της Tassos
  • Αποσυνδεμένος
  • pyth__
  • g-lts.info
  • Δημοσιεύσεις: 78
  • Ληφθείσες Ευχαριστίες 5
Τελικά παιδιά, ξέχασα να σας αναφέρω, πως την βλακεία την έκανε ο IDE. Ο IDE ( PyCharm στην προκειμένη περίπτωση ) δεν αναγνώριζε σωστά την διαδρομή των αρχείων ή τέλος πάντων τα imports μου.

Κάποια στιγμή έτσι για δοκιμή των αγνόησα και ας μου έβγαζε το error που έβγαζε πήγα και εκτέλεσα την εφαρμογή μου και αυτή εκτελέστηκε απροβλημάτιστα! Χωρίς να εμφανίσει κανένα απολύτως πρόβλημα! :P :silly: :woohoo:

( Την εκτέλεσα μέσω τερματικού )
Οπότε απλώς συνέχισα την ανάπτυξη με την χαζομάρα πως απλώς ο IDE δεν αναγνώριζε τα σωστά για την εκτέλεση imports, αλλά και έτσι όπως τα ήθελε αυτός.. τότε ήταν που πραγματικά δεν έπαιζε. :P
Ομάδα Ελληνικής - Μακροχρόνιας υποστήριξη.

Greek - Long Term Support Team.

Επισκεφθείτε μας εδώ : g-lts.info
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Συντονιστές: pmav99
Χρόνος δημιουργίας σελίδας: 0.699 δευτερόλεπτα

Μοιράσου το!

Powered by CoalaWeb

Λίστα Ταχυδρομείου