Linux 上的 pythonnet 和 .net 核心:无法声明类似字典的对象
pythonnet & .net core on Linux: Cannot declare a dictionary-like object
我正在为 Linux 制作 .net 核心应用程序。该应用程序利用 pythonnet 库与 Linux 框上的 python 模块进行交互。
我正在尝试使用 python-apt 模块进行一些 Debian 包管理,例如apt.cache
class.
本机 python 脚本可以正常工作 运行 直接在 Linux 打印所有包:
import apt
cache = apt.Cache()
for pkg_name in cache.keys():
print(pkg_name)
我的 VB.net 核心代码在正确声明 apt.Cache()
对象时遇到问题:
Runtime.PythonDLL = "/usr/lib/python3.9/config-3.9-x86_64-linux-gnu/libpython3.9.so"
Python.Runtime.PythonEngine.PythonHome = "/usr/lib/python3.9"
PythonEngine.Initialize()
Using Py.GIL
Dim apt As PyObject = Py.Import("apt_pkg")
Dim cache As PyDict = apt.Cache()
...
End Using
我得到异常:
_system not initialized
at Python.Runtime.PythonException.ThrowLastAsClrException()
at Python.Runtime.PyObject.Invoke(PyTuple args, PyDict kw)
at Python.Runtime.PyObject.InvokeMethod(String name, PyTuple args, PyDict kw)
at Python.Runtime.PyObject.TryInvokeMember(InvokeMemberBinder binder, Object[] args, Object& result)
at CallSite.Target(Closure , CallSite , Object )
at CallSite.Target(Closure , CallSite , Object )
at Microsoft.VisualBasic.CompilerServices.IDOUtils.CreateRefCallSiteAndInvoke(CallSiteBinder action, Object instance, Object[] arguments)
at Microsoft.VisualBasic.CompilerServices.IDOBinder.IDOGet(IDynamicMetaObjectProvider instance, String memberName, Object[] arguments, String[] argumentNames, Boolean[] copyBack)
at Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateGet(Object instance, Type type, String memberName, Object[] arguments, String[] argumentNames, Type[] typeArguments, Boolean[] copyBack)
at py_test_vb_core.Program.Main(String[] args) in Y:\Development projects~3rd part libraries\pythonnet\py_test_vb_core\py_test_vb_core\Program.vb:line 17
documentation 说 apt.Cache()
是一个“类似字典的对象”
我在 Windows 上使用 Visual Studio,我可以使用 SSH 连接到 Linux 盒子,并且可以很好地调试 .net 核心应用程序。
另一个问题:是否可以在 Visual Studio 调试器中公开本机 python python-apt 模块的所有 class 成员等?我不敢寄希望于 IntelliSense 支持,但如果我能在调试中看到 python-apt
模块的 class 成员等,那将是一个很大的帮助?它还可以帮助我正确声明上述对象。
(c#帮助也可以)
我想我只是导入了错误的模块,apt_pkg
而不是 apt
C# 版本(.net 中嵌入的 python 代码):
static void Main(string[] args)
{
Runtime.PythonDLL = "/usr/lib/python3.9/config-3.9-x86_64-linux-gnu/libpython3.9.so";
//PythonEngine.PythonHome = "/usr/bin/python3"; //"/usr/lib/python3.9"; //
//PythonEngine.Initialize();
using (Py.GIL())
{
dynamic APT = Py.Import("apt"); // Type: <module 'apt' from '/usr/lib/python3/dist-packages/apt/__init__.py'>
dynamic Cache = APT.Cache(); // Type: <apt.cache.Cache object at 0x7fa701ec6760>
dynamic PKGs = Cache.keys(); // Type: ['0ad', '0ad-data',...]
foreach (string pkg_name in (String[])PKGs)
{
Console.WriteLine(pkg_name);
}
}
Environment.Exit(0);
}
我正在为 Linux 制作 .net 核心应用程序。该应用程序利用 pythonnet 库与 Linux 框上的 python 模块进行交互。
我正在尝试使用 python-apt 模块进行一些 Debian 包管理,例如apt.cache
class.
本机 python 脚本可以正常工作 运行 直接在 Linux 打印所有包:
import apt
cache = apt.Cache()
for pkg_name in cache.keys():
print(pkg_name)
我的 VB.net 核心代码在正确声明 apt.Cache()
对象时遇到问题:
Runtime.PythonDLL = "/usr/lib/python3.9/config-3.9-x86_64-linux-gnu/libpython3.9.so"
Python.Runtime.PythonEngine.PythonHome = "/usr/lib/python3.9"
PythonEngine.Initialize()
Using Py.GIL
Dim apt As PyObject = Py.Import("apt_pkg")
Dim cache As PyDict = apt.Cache()
...
End Using
我得到异常:
_system not initialized at Python.Runtime.PythonException.ThrowLastAsClrException() at Python.Runtime.PyObject.Invoke(PyTuple args, PyDict kw) at Python.Runtime.PyObject.InvokeMethod(String name, PyTuple args, PyDict kw) at Python.Runtime.PyObject.TryInvokeMember(InvokeMemberBinder binder, Object[] args, Object& result) at CallSite.Target(Closure , CallSite , Object ) at CallSite.Target(Closure , CallSite , Object ) at Microsoft.VisualBasic.CompilerServices.IDOUtils.CreateRefCallSiteAndInvoke(CallSiteBinder action, Object instance, Object[] arguments) at Microsoft.VisualBasic.CompilerServices.IDOBinder.IDOGet(IDynamicMetaObjectProvider instance, String memberName, Object[] arguments, String[] argumentNames, Boolean[] copyBack) at Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateGet(Object instance, Type type, String memberName, Object[] arguments, String[] argumentNames, Type[] typeArguments, Boolean[] copyBack) at py_test_vb_core.Program.Main(String[] args) in Y:\Development projects~3rd part libraries\pythonnet\py_test_vb_core\py_test_vb_core\Program.vb:line 17
documentation 说 apt.Cache()
是一个“类似字典的对象”
我在 Windows 上使用 Visual Studio,我可以使用 SSH 连接到 Linux 盒子,并且可以很好地调试 .net 核心应用程序。
另一个问题:是否可以在 Visual Studio 调试器中公开本机 python python-apt 模块的所有 class 成员等?我不敢寄希望于 IntelliSense 支持,但如果我能在调试中看到 python-apt
模块的 class 成员等,那将是一个很大的帮助?它还可以帮助我正确声明上述对象。
(c#帮助也可以)
我想我只是导入了错误的模块,apt_pkg
而不是 apt
C# 版本(.net 中嵌入的 python 代码):
static void Main(string[] args)
{
Runtime.PythonDLL = "/usr/lib/python3.9/config-3.9-x86_64-linux-gnu/libpython3.9.so";
//PythonEngine.PythonHome = "/usr/bin/python3"; //"/usr/lib/python3.9"; //
//PythonEngine.Initialize();
using (Py.GIL())
{
dynamic APT = Py.Import("apt"); // Type: <module 'apt' from '/usr/lib/python3/dist-packages/apt/__init__.py'>
dynamic Cache = APT.Cache(); // Type: <apt.cache.Cache object at 0x7fa701ec6760>
dynamic PKGs = Cache.keys(); // Type: ['0ad', '0ad-data',...]
foreach (string pkg_name in (String[])PKGs)
{
Console.WriteLine(pkg_name);
}
}
Environment.Exit(0);
}