1

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

谢谢!

4

2 回答 2

1

似乎__file__ 变量在模块 init 中不可用。但是你可以__file__在模块加载后得到:

def get_file():
    return __file__

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

有关它的更多信息在这个问题中

找到了两种工作方法。

  1. 涉及检查模块:

    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] 文件以使其工作。

于 2016-11-29T06:53:40.260 回答
0

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

于 2020-09-29T20:35:09.767 回答