Mise à jour 2018-11-28:
Voici un résumé des expériences avec Python 2 et 3. Avec
main.py - exécute foo.py
foo.py - exécute lib / bar.py
lib / bar.py - imprime les expressions de chemin de fichier
| Python | Run statement | Filepath expression |
|--------+---------------------+----------------------------------------|
| 2 | execfile | os.path.abspath(inspect.stack()[0][1]) |
| 2 | from lib import bar | __file__ |
| 3 | exec | (wasn't able to obtain it) |
| 3 | import lib.bar | __file__ |
Pour Python 2, il peut être plus clair de passer aux packages, vous pouvez donc l'utiliser from lib import bar
- ajoutez simplement des __init__.py
fichiers vides aux deux dossiers.
Pour Python 3, execfile
n'existe pas - l'alternative la plus proche est exec(open(<filename>).read())
, bien que cela affecte les cadres de pile. Il est plus simple à utiliser import foo
et import lib.bar
- aucun __init__.py
fichier n'est nécessaire.
Voir aussi Différence entre import et execfile
Réponse originale:
Voici une expérience basée sur les réponses de ce fil - avec Python 2.7.10 sous Windows.
Les piles basées sur la pile sont les seules qui semblent donner des résultats fiables. Les deux derniers ont la syntaxe la plus courte , c'est-à-dire -
print os.path.abspath(inspect.stack()[0][1]) # C:\filepaths\lib\bar.py
print os.path.dirname(os.path.abspath(inspect.stack()[0][1])) # C:\filepaths\lib
Voici à ces ajouts à sys en tant que fonctions! Crédit à @Usagi et @pablog
Sur la base des trois fichiers suivants, et en exécutant main.py à partir de son dossier avec python main.py
(également des fichiers exécutés essayés avec des chemins absolus et appelant à partir d'un dossier séparé).
C: \ filepaths \ main.py: execfile('foo.py')
C: \ filepaths \ foo.py: execfile('lib/bar.py')
C: \ filepaths \ lib \ bar.py:
import sys
import os
import inspect
print "Python " + sys.version
print
print __file__ # main.py
print sys.argv[0] # main.py
print inspect.stack()[0][1] # lib/bar.py
print sys.path[0] # C:\filepaths
print
print os.path.realpath(__file__) # C:\filepaths\main.py
print os.path.abspath(__file__) # C:\filepaths\main.py
print os.path.basename(__file__) # main.py
print os.path.basename(os.path.realpath(sys.argv[0])) # main.py
print
print sys.path[0] # C:\filepaths
print os.path.abspath(os.path.split(sys.argv[0])[0]) # C:\filepaths
print os.path.dirname(os.path.abspath(__file__)) # C:\filepaths
print os.path.dirname(os.path.realpath(sys.argv[0])) # C:\filepaths
print os.path.dirname(__file__) # (empty string)
print
print inspect.getfile(inspect.currentframe()) # lib/bar.py
print os.path.abspath(inspect.getfile(inspect.currentframe())) # C:\filepaths\lib\bar.py
print os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) # C:\filepaths\lib
print
print os.path.abspath(inspect.stack()[0][1]) # C:\filepaths\lib\bar.py
print os.path.dirname(os.path.abspath(inspect.stack()[0][1])) # C:\filepaths\lib
print
__file__
absolu ou relatif?