web-dev-qa-db-fra.com

Comment obtenir le nom de fichier du module __main__ en Python?

Supposons que j'ai deux modules:

a.py:

import b
print __name__, __file__

b.py:

print __name__, __file__

J'exécute le fichier "a.py". Cela imprime:

b        C:\path\to\code\b.py
__main__ C:\path\to\code\a.py

Question: comment puis-je obtenir le chemin vers le __main__ module ("a.py" dans ce cas) depuis la bibliothèque "b.py"?

59
Roman Starkov
import __main__
print __main__.__file__
68
ironfroggy

Peut-être que cela fera l'affaire:

import sys
from os import path
print path.abspath(sys.modules['__main__'].__file__)

Notez que, par sécurité, vous devez vérifier si le __main__ le module a un __file__ attribut. S'il est créé dynamiquement ou s'il est simplement exécuté dans la console interactive python console, il n'aura pas de __file__:

python
>>> import sys
>>> print sys.modules['__main__']
<module '__main__' (built-in)>
>>> print sys.modules['__main__'].__file__
AttributeError: 'module' object has no attribute '__file__'

Une simple vérification hasattr () fera l'affaire pour se prémunir contre le scénario 2 si c'est une possibilité dans votre application.

34
Jarret Hardie

Le code python ci-dessous fournit des fonctionnalités supplémentaires, notamment qu'il fonctionne de manière transparente avec py2exe exécutables.

J'utilise un code similaire pour aimer cela afin de trouver des chemins relatifs au script en cours d'exécution, alias __main__. comme avantage supplémentaire, il fonctionne sur plusieurs plates-formes, y compris Windows.

import imp
import os
import sys

def main_is_frozen():
   return (hasattr(sys, "frozen") or # new py2exe
           hasattr(sys, "importers") # old py2exe
           or imp.is_frozen("__main__")) # tools/freeze

def get_main_dir():
   if main_is_frozen():
       # print 'Running from path', os.path.dirname(sys.executable)
       return os.path.dirname(sys.executable)
   return os.path.dirname(sys.argv[0])

# find path to where we are running
path_to_script=get_main_dir()

# OPTIONAL:
# add the sibling 'lib' dir to our module search path
lib_path = os.path.join(get_main_dir(), os.path.pardir, 'lib')
sys.path.insert(0, lib_path)

# OPTIONAL: 
# use info to find relative data files in 'data' subdir
datafile1 = os.path.join(get_main_dir(), 'data', 'file1')

Espérons que l'exemple de code ci-dessus puisse fournir des informations supplémentaires sur la façon de déterminer le chemin d'accès au script en cours d'exécution ...

15
popcnt

Une autre méthode consisterait à utiliser sys.argv[0].

import os
import sys

main_file = os.path.realpath(sys.argv[0]) if sys.argv[0] else None

sys.argv[0] sera une chaîne vide si Python commence par -c ou si coché depuis la console Python console.

8
lrsjng
import sys, os

def getExecPath():
    try:
        sFile = os.path.abspath(sys.modules['__main__'].__file__)
    except:
        sFile = sys.executable
    return os.path.dirname(sFile)

Cette fonction fonctionnera pour Python et les programmes compilés Cython.

2
James