首页 > 编程问答 >在pip包中分发pythonnet dll类型信息

在pip包中分发pythonnet dll类型信息

时间:2024-07-24 06:06:53浏览次数:14  
标签:python types pip

我已经能够使用 C# 通过以下方式加载 pythonnet dll:

from importlib.resources import path
import sys

# Assuming 'my_package.lib' is the sub-package containing the DLLs
with path('pyrp.lib', '') as lib_path:
    sys.path.append(str(lib_path))

# Now you can import your dependencies as if they were in the same directory
from pythonnet import load
load('coreclr')
import clr

def load_APIStandard():
    clr.AddReference("myDLL")
    from myDLL import APIStandard

    # Return the imported module or any objects you need from it
    return APIStandard

并且我拥有使用 此工具 生成的类型信息。一个例子是

#__init__.pyi
from System import Array_1
from myDLL import AnalysisResult

class APIStandard(abc.ABC):
    @staticmethod
    def AnalyzeData(data: Array_1[int]) -> AnalysisResult: ...

如果编辑我的VSCode,我可以让这个类型信息正确显示 settings.json

"python.analysis.extraPaths": [
      "./pyrp/lib/PythonTypes" // Add the path to your "types" directory here, adjust the path as necessary
    ]

但是无论我如何将这些类型打包到pip包中,我都无法让解释器在本地找到它们。有什么建议么?


要将 Python.NET DLL 类型信息打包到 pip 包中,并使其自动被解释器识别,你需要进行以下步骤:

1. 项目结构:

确保你的项目具有以下结构:

your_package/
├── your_package/
│   ├── __init__.py
│   ├── lib/
│   │   ├── PythonTypes/
│   │   │   ├── __init__.pyi
│   │   │   ├── myDLL.pyi
│   │   ├── your_dlls.dll
│   └── ... other modules
├── setup.py
└── ... other files

2. setup.py:

在你的 setup.py 文件中,你需要使用 package_data 参数来包含类型信息文件。例如:

from setuptools import setup, find_packages

setup(
    name='your_package',
    version='0.1.0',
    packages=find_packages(),
    package_data={
        'your_package': ['lib/PythonTypes/*.pyi']
    },
    install_requires=[
        'pythonnet',
        # ... other dependencies
    ],
    zip_safe=False,
)

3. init .py:

在你的包的 __init__.py 文件中,你需要在导入其他模块之前将 PythonTypes 目录添加到 Python 路径中。可以使用 pkg_resources 模块来实现:

import pkg_resources
import sys

# 获取安装包的路径
resource_package = __name__  # 使用当前包的名称

# 获取 PythonTypes 目录的路径
resource_path = 'lib/PythonTypes'
python_types_path = pkg_resources.resource_filename(resource_package, resource_path)

# 将路径添加到 sys.path
if python_types_path not in sys.path:
    sys.path.append(python_types_path)

# 现在你可以导入其他模块,包括类型信息
from .lib import load
load('coreclr')
# ... 其他导入

4. 打包和安装:

使用以下命令构建和安装你的包:

python setup.py sdist bdist_wheel
pip install dist/your_package-0.1.0-py3-none-any.whl 

完成这些步骤后,解释器应该能够自动找到并使用你提供的类型信息。

注意:

  • 确保你的 .pyi 文件位于正确的目录中,并且文件名与相应的 DLL 文件名匹配。
  • 在开发过程中,你可能需要清除缓存或使用 pip install --upgrade --force-reinstall your_package 来确保安装了最新的更改。

希望这些步骤能够帮助你在 pip 包中分发 Python.NET DLL 类型信息。 如果还有其他问题,请随时提出。

标签:python,types,pip
From: 78785682

相关文章

  • 尝试使用 pyinstaller 将 python 文件转换为可执行文件时出现 TypeError
    稍后的目的是通过命令行向GPT4all发送问题并将答案存储在文本文档中。我想将阻止代码转换为exe,但它产生了TypeError。这是到目前为止的代码:fromgpt4allimportGPT4Allmodel=GPT4All("Meta-Llama-3-8B-Instruct.Q4_0.gguf",device='cpu')#downloads/loads......
  • 使用 Python-PlexAPI 获取 plex 上所有好友的关注列表
    有关如何接收我的plex服务器上所有用户的监视列表的任何提示。我正在根据一些规则创建自动删除,其中一个规则是,如果电影位于用户观看列表中,则不应删除该电影。我遇到了麻烦,因为所有与观看列表相关的内容都在MyPlexAccount上。lexapi.myplex.MyPlexAccount具有我的用......
  • 如何在 Python 中查看与 Azure OpenAI 助手关联的所有上传文件?
    我正在使用Python对文档中的问题进行基准测试,并在jupyter笔记本中实例化了我的助手。我想确认助手是否有我上传的文件,但似乎找不到有关此功能将使用什么功能的文档。使用适用于AzureOpenAI的最新版本的PythonAPI。目前,无法使用AzureOpenAI的PythonAPI直接查看......
  • 如何在Python中计算小数?
    我正在创建一个计算器来用python计算企业的利润,但到目前为止我只能使用整数。这是我的代码示例:Gross=int(input("PleaseentertotalGrossRevenuefortheFiscalYear"))NetTaxes=int(Gross)*0.1所以我将会计年度的总收入乘以按“税率”计算,但我只能使用......
  • 如何使用 Python 打开 Google Firestore 上的特定数据库?
    我正在使用Firebase并使用以下代码从Firestore设置/检索文档:importfirebase_adminfromfirebase_adminimportcredentials,firestorecred=credentials.ApplicationDefault()firebase_admin.initialize_app(cred,options={"projectId":"huq-jimbo"})fires......
  • 如何使用 Python 和 Numpy 重现 Matlab 文件读取以解码 .dat 文件?
    我有一个Matlab脚本,可以读取编码的.dat文件,对其进行解码并保存。我试图使用numpy将其转换为Python。我发现对于同一个文件,我得到不同的输出结果(python数字没有意义)。该代码最初作为从串行端口读取的脚本的一部分运行,因此是数据的结构。我首先认为位移是问题所在,因为......
  • 在Python中调整pdf页面大小
    我正在使用python裁剪pdf页面。一切正常,但如何更改页面大小(宽度)?这是我的裁剪代码:input=PdfFileReader(file('my.pdf','rb'))p=input.getPage(1)(w,h)=p.mediaBox.upperRightp.mediaBox.upperRight=(w/4,h)output.addPage(p)当我裁剪页面时,我也需要......
  • 如何使用 python 更改资源管理器窗口中的路径?
    没有人知道如何在不使用python打开新实例的情况下更改资源管理器窗口中的当前路径吗?例如,如果用户使用C:\Users\User打开资源管理器窗口。然后我必须将该路径更改为C:\Windows\System32例如。提前致谢。很遗憾,无法直接使用Python更改现有文件资源管理器窗口的......
  • python 以及将数组传递给函数的问题
    我需要求解一些常微分方程$\frac{dy}{dx}=f(x)=x^2ln(x)$并继续在限制0之间创建数组xpt。<=xpt<=2因为我必须小心xpt=0,所以我将函数定义如下deff(x):ifx<=1.e-6:return0.else:returnnp.square(x)*np.log(x)我的调用程序读取Np......
  • 如果 Python 脚本正在使用文件夹,如何在文件资源管理器中进行更改时防止 Windows 的“
    我有一个简单的脚本,显示在QTreeView中的QListView中选择的目录的内容,我想添加打开文件资源管理器的功能,以让用户编辑目录内的内容。但是,添加新的文件夹和文件可以,但删除或移动文件夹或文件会提示“文件夹正在使用”错误:此操作无法完成,因为该文件已在另一个程......