2016-11-29 1 views
1

J'ai un fichier package.py que j'essaye de classer dans package.pyd. J'ai fait la déclaration suivante dans package.pyComment obtenir le chemin du fichier pyd aka l'équivalent de __file__

CURR = os.path.dirname(os.path.realpath(__file__)) 

qui fonctionne très bien quand je lance package.py mais quand j'importer package.pyd dans un autre fichier wrapper.py je reçois le message d'erreur suivant

Traceback (most recent call last): 
    File "C:\Projects\Wrapper.py", line 1, in <module> 
    import package 
    File "package.py", line 40, in init package (package.c:4411) 
NameError: name '__file__' is not defined 

Comment puis-je obtenir l'emplacement le fichier .pyd. Il existe également un moyen de vérifier s'il est exécuté en tant que .pyd ou .py.

Merci!

Répondre

1

Il semble que __file__ variable not available in module init. Mais vous pouvez obtenir __file__ après module a été chargé:

def get_file(): 
    return __file__ 

Vous pouvez vérifier la variable __file__ de savoir quel fichier a été chargé. Gardez également à l'esprit l'ordre de recherche de python: pyd (so), py, pyw(for windows), pyc.

Plus d'informations à ce sujet est dans ce this question

a trouvé deux méthodes de travail.

  1. impliquant inspect Module:

    import inspect 
    import sys 
    import os 
    
    if hasattr(sys.modules[__name__], '__file__'): 
        _file_name = __file__ 
    else: 
        _file_name = inspect.getfile(inspect.currentframe()) 
    
    CURR = os.path.dirname(os.path.realpath(_file_name)) 
    
  2. import certains fichiers du même niveau et en utilisant son __file__ attribut:

    import os 
    from . import __file__ as _initpy_file 
    CURR = os.path.dirname(os.path.realpath(_initpy_file)) 
    

    En fait, il ne doit pas être __init__.py Module , vous pouvez ajouter et importer n'importe quel fichier [vide] pour le faire fonctionner.

+0

Cela n'a pas marché pour moi, probablement parce que j'appelle 'get_file()' qui à son tour tente de localiser '__file__'. J'ai effectivement cherché une solution de contournement. Une variable d'environnement :) dans un 'try-except'. Mais je rencontre de nouveaux obstacles lorsque j'essaie de convertir des fichiers .py en fichiers .pyd. Il semble qu'il y ait tellement de choses considérées comme allant de soi quand on fait un paquetage .py qui n'est pas bon lorsqu'on le convertit en .pyd – coolarm