82 votes

Comment obtenir le nom de l' __principaux__ module en Python?

Supposons que j'ai deux modules:

un.py:

import b
print __name__, __file__

b.py:

print __name__, __file__

Je lance le "un.py" fichier. Cette affiche:

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

Question: comment puis-je obtenir le chemin d'accès à l' __main__ module ("un.py" dans ce cas) dans la "b.py" bibliothèque?

103voto

ironfroggy Points 3496
import __main__
print __main__.__file__

41voto

Jarret Hardie Points 36266

Peut-être que cela fera l'affaire:

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

Notez que pour des raisons de sécurité, vous devez vérifier si l' __main__ module __file__ d'attribut. Si c'est créé dynamiquement, ou c'est juste en cours d'exécution dans le interactif python console, il n'aura pas un __file__:

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

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

17voto

popcnt Points 1842

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

Je utiliser un code similaire pour ce genre pour trouver des chemins d'accès relatifs à l'exécution de script, aka __main__. comme un avantage supplémentaire, il fonctionne de la croix-plate-forme 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 peut fournir des informations supplémentaires sur la façon de déterminer le chemin d'accès au script en cours...

9voto

lrsjng Points 1691

Une autre méthode serait d'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 obtient commencer avec -c ou, si vérifié à partir de la console Python.

4voto

James Points 11
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 va travailler pour Python et Cython des programmes compilés.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X