如何获取pyd文件的路径也等同于__file__

时间:2016-11-29 03:51:07

标签: python cython cythonize

我有一个文件package.py我想要打包到package.pyd。我在package.py

中有以下声明
    CURR = os.path.dirname(os.path.realpath(__file__))

在我运行package.py时工作正常,但当我将package.pyd导入另一个文件wrapper.py时,我收到以下错误消息

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

如何获取.pyd文件的位置。还有一种方法可以检查它是以.pyd还是.py运行。

谢谢!

2 个答案:

答案 0 :(得分:1)

似乎是__file__ variable not available in module init。 但是你可以在加载模块后获得__file__

def get_file():
    return __file__

您可以检查__file__变量以了解加载了哪个文件。 另请记住python的搜索顺序:pyd (so), py, pyw(for windows), pyc

有关它的更多信息,请参阅此this question

找到两种工作方法。

  1. 涉及inspect模块:

    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来自同一级别并使用其__file__属性的某个文件:

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

    实际上,它不一定是__init__.py模块,您可以添加和导入任何[空]文件以使其正常工作。

答案 1 :(得分:0)

__file__现在可以在支持多阶段模块初始化的Python版本(Python> = 3.5)上运行时,在最新的Cython版本(0.27 ish)中运行。请参见https://github.com/cython/cython/issues/1715,了解添加点。