【问题标题】:How to get path of the pyd file aka equivalent of __file__如何获取相当于 __file__ 的 pyd 文件的路径
【发布时间】:2016-11-29 03:51:07
【问题描述】:

我有一个文件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 运行。

谢谢!

【问题讨论】:

    标签: python cython cythonize


    【解决方案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模块,你可以添加和导入任何[empty]文件使其工作。

    【讨论】:

    • 这对我不起作用,可能是因为我打电话给get_file(),而后者又试图找到__file__。我实际上已经在寻找解决方法。 try-except 中的环境变量:)。但是当我尝试将 .py 转换为 .pyd 二进制文件时,我遇到了新的障碍。看起来在制作 .py 包时有很多事情被认为是理所当然的,但在将其转换为 .pyd 时并不适用
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-25
      • 2020-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-31
      相关资源
      最近更新 更多