Πώς μπορώ να αποκτήσω τη διαδρομή και το όνομα του αρχείου που σήμερα εκτελεί;

ψήφοι
370

Έχω scripts καλώντας άλλα αρχεία script, αλλά εγώ πρέπει να πάρει το filepath του αρχείου που εκτελείται στο πλαίσιο της διαδικασίας.

Για παράδειγμα, ας υποθέσουμε ότι έχω τρία αρχεία. Χρησιμοποιώντας execfile :

  • script_1.pyκαλεί script_2.py.
  • Με τη σειρά της, script_2.pyκαλεί script_3.py.

Πώς μπορώ να βρω το όνομα του αρχείου και τη διαδρομή του script_3.py, από τον κώδικα μέσαscript_3.py , χωρίς να χρειάζεται να περάσουν τις πληροφορίες αυτές ως επιχειρήματα από script_2.py;

(Εκτέλεση os.getcwd()αποδόσεις δεν filepath του αρχικού σεναρίου εκκίνησης για την τρέχουσα αρχείου.)

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


29 απαντήσεις

ψήφοι
11

Δεν είναι εντελώς σαφές τι εννοούμε με τον όρο «το filepath του αρχείου που εκτελείται στο πλαίσιο της διαδικασίας». sys.argv[0]συνήθως περιέχει τη θέση του σεναρίου που επικαλείται ο διερμηνέας Python. Ελέγξτε την τεκμηρίωση sys για περισσότερες λεπτομέρειες.

Όπως @Tim και @Pat Notz έχουν επισημάνει, η __FILE__ χαρακτηριστικό παρέχει πρόσβαση σε

το αρχείο από το οποίο η μονάδα ήταν φορτωμένο, εάν φορτώθηκε από ένα αρχείο

Απαντήθηκε 08/09/2008 στις 18:42
πηγή χρήστη

ψήφοι
5

Νομίζω ότι είναι απλά __file__ Ακούγεται σαν μπορείτε επίσης να θελήσετε να checkout την ενότητα επιθεωρήσει .

Απαντήθηκε 08/09/2008 στις 18:44
πηγή χρήστη

ψήφοι
7

Το __file__χαρακτηριστικό λειτουργεί τόσο για το αρχείο που περιέχει το κύριο εκτέλεση κώδικα καθώς και τα εισαγόμενα ενότητες.

δείτε https://web.archive.org/web/20090918095828/http://pyref.infogami.com/__file__

Απαντήθηκε 08/09/2008 στις 18:56
πηγή χρήστη

ψήφοι
213

p1.py:

execfile("p2.py")

p2.py:

import inspect, os
print inspect.getfile(inspect.currentframe()) # script filename (usually with path)
print os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) # script directory
Απαντήθηκε 08/09/2008 στις 22:02
πηγή χρήστη

ψήφοι
4

Μπορείς να χρησιμοποιήσεις inspect.stack()

import inspect,os
inspect.stack()[0]  => (<frame object at 0x00AC2AC0>, 'g:\\Python\\Test\\_GetCurrentProgram.py', 15, '<module>', ['print inspect.stack()[0]\n'], 0)
os.path.abspath (inspect.stack()[0][1]) => 'g:\\Python\\Test\\_GetCurrentProgram.py'
Απαντήθηκε 08/09/2008 στις 23:00
πηγή χρήστη

ψήφοι
448
__file__

όπως είπαν και άλλοι. Μπορεί επίσης να θέλετε να χρησιμοποιήσετε os.path.realpath για την εξάλειψη των συμβολικών συνδέσμων:

import os

os.path.realpath(__file__)
Απαντήθηκε 23/12/2009 στις 19:33
πηγή χρήστη

ψήφοι
5
import sys

print sys.path[0]

Αυτό θα εκτυπώσει το μονοπάτι του σεναρίου σήμερα εκτέλεσης

Απαντήθηκε 02/01/2010 στις 17:34
πηγή χρήστη

ψήφοι
32

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

Αν θέλετε να μάθετε το όνομα του εκτελέσιμου (δηλαδή το αρχείο ρίζα πέρασε στον διερμηνέα python για το τρέχον πρόγραμμα) από ένα αρχείο που μπορεί να εισαχθεί ως μονάδα, θα πρέπει να το κάνετε αυτό (ας υποθέσουμε ότι αυτό είναι ένα αρχείο που ονομάζεται foo.py ):

import inspect

print inspect.stack()[-1][1]

Επειδή το τελευταίο πράγμα ( [-1]) στη στοίβα είναι το πρώτο πράγμα που πήγε σε αυτό (στοίβες είναι δομές δεδομένων LIFO / FILO).

Στη συνέχεια, το αρχείο bar.py αν import fooαυτό θα εκτυπώσετε bar.py , παρά foo.py , η οποία θα ήταν η αξία όλων αυτών:

  • __file__
  • inspect.getfile(inspect.currentframe())
  • inspect.stack()[0][1]
Απαντήθηκε 26/02/2010 στις 21:25
πηγή χρήστη

ψήφοι
3
import sys
print sys.argv[0]
Απαντήθηκε 19/04/2010 στις 06:47
πηγή χρήστη

ψήφοι
0

Θα χρησιμοποιηθεί για την προσέγγιση με __FILE__
os.path.abspath(__file__)
, αλλά υπάρχει ένα μικρό κόλπο, επιστρέφει το αρχείο .py όταν ο κώδικας εκτελείται για πρώτη φορά, την επόμενη τρέχει να δώσει το όνομα του αρχείο * .pyc
έτσι έμεινα με:
inspect.getfile(inspect.currentframe())
ή
sys._getframe().f_code.co_filename

Απαντήθηκε 01/03/2011 στις 08:23
πηγή χρήστη

ψήφοι
59

Νομίζω ότι αυτό είναι καθαρότερο:

import inspect
print inspect.stack()[0][1]

και παίρνει τις ίδιες πληροφορίες, όπως:

print inspect.getfile(inspect.currentframe())

Όπου [0] είναι το τρέχον πλαίσιο της στοίβας (κορυφή του σωρού) και [1] είναι το όνομα του αρχείου, αύξηση για να πάει πίσω στη στοίβα, δηλαδή

print inspect.stack()[1][1]

θα είναι το όνομα του αρχείου της δέσμης ενεργειών που ονομάζεται το τρέχον πλαίσιο. Επίσης, με τη χρήση [-1] θα φτάσετε στο κάτω μέρος της στοίβας, η αρχική κλήση σενάριο.

Απαντήθηκε 08/07/2011 στις 16:50
πηγή χρήστη

ψήφοι
8

Έχω ένα σενάριο που πρέπει να λειτουργούν κάτω από τα παράθυρα περιβάλλον. Αυτός ο κωδικός snipped είναι αυτό που έχω τελειώσει με:

import os,sys
PROJECT_PATH = os.path.abspath(os.path.split(sys.argv[0])[0])

είναι αρκετά Hacky απόφαση. Αλλά αυτό δεν απαιτεί εξωτερικές βιβλιοθήκες και αυτό είναι το πιο σημαντικό πράγμα στη δική μου περίπτωση.

Απαντήθηκε 08/08/2012 στις 08:42
πηγή χρήστη

ψήφοι
-1

αν θέλετε μόνο το όνομα του αρχείου χωρίς ./ή .pyμπορείτε να δοκιμάσετε αυτό

filename = testscript.py
file_name = __file__[2:-3]

file_name θα εκτυπώσει testscript μπορείτε να δημιουργήσετε ό, τι θέλετε, αλλάζοντας το δείκτη μέσα στο []

Απαντήθηκε 20/01/2013 στις 18:52
πηγή χρήστη

ψήφοι
-1
import os

import wx


# return the full path of this file
print(os.getcwd())

icon = wx.Icon(os.getcwd() + '/img/image.png', wx.BITMAP_TYPE_PNG, 16, 16)

# put the icon on the frame
self.SetIcon(icon)
Απαντήθηκε 24/01/2013 στις 00:43
πηγή χρήστη

ψήφοι
13
import os
print os.path.basename(__file__)

Αυτό θα μας δώσει μόνο το όνομα του αρχείου. δηλαδή εάν abspath του αρχείου c: \ abcd \ abc.py τότε 2η γραμμή θα εκτυπώσει abc.py

Απαντήθηκε 11/08/2013 στις 02:05
πηγή χρήστη

ψήφοι
5
import os
os.path.dirname(os.path.abspath(__file__))

Δεν υπάρχει ανάγκη για την επιθεώρηση ή οποιαδήποτε άλλη βιβλιοθήκη.

Αυτό λειτούργησε για μένα όταν είχα να εισάγει ένα σενάριο (από ένα διαφορετικό κατάλογο, τότε η εκτελέστηκε σενάριο), το οποίο χρησιμοποιείται ένα αρχείο ρυθμίσεων που κατοικούν στον ίδιο φάκελο με το εισαγόμενο σενάριο.

Απαντήθηκε 24/06/2014 στις 14:04
πηγή χρήστη

ψήφοι
33
import os
os.path.dirname(__file__) # relative directory path
os.path.abspath(__file__) # absolute file path
os.path.basename(__file__) # the file name only
Απαντήθηκε 05/02/2015 στις 23:05
πηγή χρήστη

ψήφοι
2

Αυτό θα πρέπει να εργαστεί:

import os,sys
filename=os.path.basename(os.path.realpath(sys.argv[0]))
dirname=os.path.dirname(os.path.realpath(sys.argv[0]))
Απαντήθηκε 14/06/2015 στις 15:37
πηγή χρήστη

ψήφοι
61

Εδώ είναι ένα πείραμα με βάση τις απαντήσεις σε αυτό το νήμα - με Python 2.7.10 για τα Windows.

Αυτοί stack-based είναι οι μόνοι που φαίνεται να δίνουν αξιόπιστα αποτελέσματα. Οι δύο τελευταίες έχουν τη μικρότερη σύνταξη , δηλαδή -

print os.path.abspath(inspect.stack()[0][1])                   # C:\testpath\lib\script3.py
print os.path.dirname(os.path.abspath(inspect.stack()[0][1]))  # C:\testpath\lib

Εδώ είναι αυτά που προστίθενται στο sys και λειτουργίες! Οι πιστώσεις προς @Usagi και @pablog

Με βάση τα ακόλουθα τρία αρχεία, και να λειτουργήσει script1.py από φάκελο με python script1.py(επίσης προσπάθησε execfiles με απόλυτη μονοπάτια και ζητώντας από ένα ξεχωριστό φάκελο).

C: \ testpath \ script1.py: execfile('script2.py')
C: \ testpath \ script2.py: execfile('lib/script3.py')
C: \ testpath \ lib \ script3.py:

import sys
import os
import inspect

print "Python " + sys.version
print

print __file__                                        # script1.py
print sys.argv[0]                                     # script1.py
print inspect.stack()[0][1]                           # lib/script3.py
print sys.path[0]                                     # C:\testpath
print

print os.path.realpath(__file__)                      # C:\testpath\script1.py
print os.path.abspath(__file__)                       # C:\testpath\script1.py
print os.path.basename(__file__)                      # script1.py
print os.path.basename(os.path.realpath(sys.argv[0])) # script1.py
print

print sys.path[0]                                     # C:\testpath
print os.path.abspath(os.path.split(sys.argv[0])[0])  # C:\testpath
print os.path.dirname(os.path.abspath(__file__))      # C:\testpath
print os.path.dirname(os.path.realpath(sys.argv[0]))  # C:\testpath
print os.path.dirname(__file__)                       # (empty string)
print

print inspect.getfile(inspect.currentframe())         # lib/script3.py

print os.path.abspath(inspect.getfile(inspect.currentframe())) # C:\testpath\lib\script3.py
print os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) # C:\testpath\lib
print

print os.path.abspath(inspect.stack()[0][1])          # C:\testpath\lib\script3.py
print os.path.dirname(os.path.abspath(inspect.stack()[0][1]))  # C:\testpath\lib
print
Απαντήθηκε 06/08/2015 στις 21:50
πηγή χρήστη

ψήφοι
0

Έγραψα μια λειτουργία που λαμβάνουν υπόψη έκλειψη πρόγραμμα εντοπισμού σφαλμάτων και unittest . Θα επιστρέψει το φάκελο του πρώτου σεναρίου θα ξεκινήσει. Μπορείτε προαιρετικά να καθορίσετε το __FILE__ var, αλλά το κυριότερο είναι ότι δεν έχετε να μοιραστείτε αυτή τη μεταβλητή σε όλα σας ιεραρχίας κλήση .

Ίσως μπορείτε να χειριστείτε τους άλλους στοίβα συγκεκριμένες περιπτώσεις δεν είδα, αλλά για μένα είναι εντάξει.

import inspect, os
def getRootDirectory(_file_=None):
    """
    Get the directory of the root execution file
    Can help: http://stackoverflow.com/questions/50499/how-do-i-get-the-path-and-name-of-the-file-that-is-currently-executing
    For eclipse user with unittest or debugger, the function search for the correct folder in the stack
    You can pass __file__ (with 4 underscores) if you want the caller directory
    """
    # If we don't have the __file__ :
    if _file_ is None:
        # We get the last :
        rootFile = inspect.stack()[-1][1]
        folder = os.path.abspath(rootFile)
        # If we use unittest :
        if ("/pysrc" in folder) & ("org.python.pydev" in folder):
            previous = None
            # We search from left to right the case.py :
            for el in inspect.stack():
                currentFile = os.path.abspath(el[1])
                if ("unittest/case.py" in currentFile) | ("org.python.pydev" in currentFile):
                    break
                previous = currentFile
            folder = previous
        # We return the folder :
        return os.path.dirname(folder)
    else:
        # We return the folder according to specified __file__ :
        return os.path.dirname(os.path.realpath(_file_))
Απαντήθηκε 14/06/2016 στις 14:06
πηγή χρήστη

ψήφοι
0

Για να πάρετε τον κατάλογο του σεναρίου εκτέλεσης

 print os.path.dirname( inspect.getfile(inspect.currentframe()))
Απαντήθηκε 10/05/2017 στις 09:51
πηγή χρήστη

ψήφοι
1

Για να διατηρηθεί η συνοχή της μετανάστευσης σε όλες τις πλατφόρμες (MacOS / Windows / Linux), δοκιμάστε να:

path = r'%s' % os.getcwd().replace('\\','/')

Απαντήθηκε 12/04/2018 στις 04:19
πηγή χρήστη

ψήφοι
0

Απλούστερος τρόπος είναι:

στην script_1.py:

import subprocess
subprocess.call(['python3',<path_to_script_2.py>])

στην script_2.py:

sys.argv[0]

PS: Έχω δοκιμάσει execfile, αλλά επειδή διαβάζει script_2.py ως συμβολοσειρά, sys.argv[0]επέστρεψε <string>.

Απαντήθηκε 08/06/2018 στις 11:29
πηγή χρήστη

ψήφοι
-1

Οι περισσότερες από αυτές τις απαντήσεις γραμμένο σε Python έκδοση 2.x ή νωρίτερα. Στην Python 3.x η σύνταξη για τη λειτουργία εκτύπωσης έχει αλλάξει για να απαιτήσει παρένθεση, δηλαδή print ().

Έτσι, αυτό νωρίτερα υψηλή βαθμολογία απάντηση από user13993 σε Python 2.x:

import inspect, os
print inspect.getfile(inspect.currentframe()) # script filename (usually with path)
print os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) # script directory

Γίνεται σε Python 3.x:

import inspect, os
print(inspect.getfile(inspect.currentframe())) # script filename (usually with path)
print(os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) ) # script directory
Απαντήθηκε 08/11/2018 στις 23:15
πηγή χρήστη

ψήφοι
0

Έχω πάντα ακριβώς χρησιμοποιείται το χαρακτηριστικό os του τρέχοντα κατάλογο εργασίας, ή ΧΕΝ. Αυτό είναι μέρος του προτύπου βιβλιοθήκης, και είναι πολύ εύκολο να υλοποιηθεί. Εδώ είναι ένα παράδειγμα:

    import os
    base_directory = os.getcwd()
Απαντήθηκε 23/01/2019 στις 14:31
πηγή χρήστη

ψήφοι
0

Δοκιμάστε αυτό,

import os
os.path.dirname(os.path.realpath(__file__))
Απαντήθηκε 22/02/2019 στις 15:31
πηγή χρήστη

ψήφοι
0
print(__file__)
print(__import__("pathlib").Path(__file__).parent)
Απαντήθηκε 05/05/2019 στις 03:19
πηγή χρήστη

ψήφοι
0

Εδώ είναι αυτό που μπορώ να χρησιμοποιήσω για να μπορώ να ρίξει τον κωδικό μου οπουδήποτε χωρίς πρόβλημα. __name__ορίζεται πάντα, αλλά __file__ορίζεται μόνο όταν ο κώδικας εκτελείται ως ένα αρχείο (π.χ. όχι σε αδράνεια / IPython).

    if '__file__' in globals():
        self_name = globals()['__file__']
    elif '__file__' in locals():
        self_name = locals()['__file__']
    else:
        self_name = __name__

Εναλλακτικά, αυτό μπορεί να γραφτεί ως:

self_name = globals().get('__file__', locals().get('__file__', __name__))
Απαντήθηκε 28/06/2019 στις 03:28
πηγή χρήστη

ψήφοι
0

Από Python 3 είναι αρκετά mainstream, θα ήθελα να περιλαμβάνει μια pathlibαπάντηση, καθώς πιστεύω ότι είναι μάλλον τώρα ένα καλύτερο εργαλείο για την πρόσβαση σε πληροφορίες του αρχείου και τη διαδρομή.

from pathlib import Path

current_file: Path = Path(__file__).resolve()

Αν αναζητάτε τον κατάλογο του τρέχοντος αρχείου, είναι τόσο εύκολο όσο προσθέτοντας .parentστον Path()δήλωση:

current_path: Path = Path(__file__).parent.resolve()
Απαντήθηκε 23/08/2019 στις 21:19
πηγή χρήστη

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