Η εύρεση ενός αρχείου σε μια κατανομή μονάδα Python

ψήφοι
20

Έχω γράψει ένα πακέτο Python που περιλαμβάνει μια βάση δεδομένων bsddb προ-υπολογίζονται οι τιμές για ένα από τα πιο χρονοβόρα υπολογισμούς. Για λόγους απλότητας, σενάριο εγκατάστασης μου εγκαθιστά το αρχείο βάσης δεδομένων στον ίδιο κατάλογο με το κώδικα που έχει πρόσβαση στη βάση δεδομένων (σε Unix, κάτι σαν /usr/lib/python2.5/site-packages/mypackage/).

Πώς μπορώ να αποθηκεύσετε το τελικό θέση του αρχείου βάσης δεδομένων, έτσι κωδικό μου μπορεί να έχει πρόσβαση; Αυτή τη στιγμή, είμαι χρησιμοποιώντας μια αμυχή με βάση το __file__μεταβλητό στην ενότητα που έχει πρόσβαση στη βάση δεδομένων:

dbname = συνάρτηση os.path.join (os.path.dirname (__ file__), database.dat)

Λειτουργεί, αλλά φαίνεται ... hackish. Υπάρχει καλύτερος τρόπος για να γίνει αυτό; Θα ήθελα να έχει το σενάριο εγκατάστασης απλά να αρπάξει την τελική θέση εγκατάστασης της μονάδας distutils και τα πράγματα σε ένα αρχείο «dbconfig.py» που εγκαθίσταται μαζί με τον κωδικό που έχει πρόσβαση στη βάση δεδομένων.

Δημοσιεύθηκε 02/09/2008 στις 08:40
πηγή χρήστη
Σε άλλες γλώσσες...                            


4 απαντήσεις

ψήφοι
4

Αυτός είναι ίσως ο τρόπος για να το κάνουμε, χωρίς να καταφεύγουν σε κάτι πιο προχωρημένο, όπως η χρήση setuptools για να εγκαταστήσετε τα αρχεία όπου ανήκουν.

Σημειώστε ότι υπάρχει ένα πρόβλημα με την προσέγγιση αυτή, επειδή σε λειτουργικά συστήματα με πραγματικό πλαίσιο ασφαλείας (Unixes, κλπ) ο χρήστης την εκτέλεση του σεναρίου σας δεν θα μπορούσε να έχει το δικαίωμα να έχουν πρόσβαση στο DB στον κατάλογο σύστημα όπου έχει εγκατασταθεί.

Απαντήθηκε 02/09/2008 στις 10:43
πηγή χρήστη

ψήφοι
25

Δοκιμάστε να χρησιμοποιήσετε pkg_resources, η οποία αποτελεί μέρος του setuptools (και είναι διαθέσιμη σε όλους τους πύθωνες έχω πρόσβαση σε αυτή τη στιγμή):

>>> import pkg_resources
>>> pkg_resources.resource_ filename(__name__, "foo.config")
'foo.config'
>>> pkg_resources.resource_filename('tempfile', "foo.config")
'/usr/lib/python2.4/foo.config'

Υπάρχει περισσότερη συζήτηση σχετικά με τη χρήση pkg_resources να πάρει τους πόρους για τη αυγά σελίδα και το pkg_resources σελίδα.

Επίσης, σημειώστε, όπου είναι δυνατόν αυτό είναι ίσως σκόπιμο να χρησιμοποιήσουν pkg_resources.resource_stream ή pkg_resources.resource_string γιατί αν το πακέτο είναι μέρος ενός αυγού, resource_filename θα αντιγράψει το αρχείο σε έναν προσωρινό κατάλογο.

Απαντήθηκε 02/09/2008 στις 13:26
πηγή χρήστη

ψήφοι
11

Χρησιμοποιήστε pkgutil.get_data. Είναι ο ξάδερφος του pkg_resources.resource_stream, αλλά στην πρότυπη βιβλιοθήκη, και θα πρέπει να συνεργαστεί με επίπεδη σύστημα αρχείων εγκαθιστά, καθώς και φερμουάρ πακέτα και άλλους εισαγωγείς.

Απαντήθηκε 29/03/2012 στις 01:52
πηγή χρήστη

ψήφοι
0

Χρησιμοποιήστε το πρότυπο Python-3.7 βιβλιοθήκης importlib.resourcesμονάδα , η οποία είναι πιο αποτελεσματική από ό, τι setuptools:pkg_resources (σε προηγούμενες εκδόσεις Python, χρησιμοποιήστε το backported importlib_resourcesβιβλιοθήκη ).

Προσοχή: Για να λειτουργήσει αυτό, ο φάκελος στον οποίο κατοικεί ο δεδομένων του αρχείου πρέπει να είναι μια τακτική python-πακέτο . Αυτό σημαίνει ότι θα πρέπει να προσθέσετε ένα __init__.pyαρχείο σε αυτό, αν δεν είναι ήδη εκεί.

Στη συνέχεια, μπορείτε να έχετε πρόσβαση ως εξής:

try:
  import importlib.resources as importlib_resources
except ImportError:
  # In PY<3.7 fall-back to backported `importlib_resources`.
  import importlib_resources


## Note that the actual package could have been used, 
#  not just its (string) name, with something like: 
#      from XXX import YYY as data_pkg
data_pkg = '.'
fname = 'database.dat'

db_bytes = importlib_resources.read_binary(data_pkg, fname)
# or if a file-like stream is needed:
with importlib_resources.open_binary(data_pkg, fname) as db_file:
    ...
Απαντήθηκε 22/06/2019 στις 11:51
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more