首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python.Net:如何在包中执行模块?

Python.Net:如何在包中执行模块?
EN

Stack Overflow用户
提问于 2022-09-14 10:24:31
回答 1查看 89关注 0票数 1

我不是Python程序员,所以如果我没有正确地理解一些术语,那么请原谅我(包装,模块)!

我有一个文件夹结构,如下所示:

代码语言:javascript
复制
C:\Test\System\
C:\Test\System\intercepts\
C:\Test\System\intercepts\utils1\
C:\Test\System\intercepts\utils2\

最后三个文件夹分别包含一个空的__init__.py文件夹,而后两个文件夹(\utils2 1、\utils2 2)包含许多.py模块。为了解决我的问题,我试图在驻留在\utils1 1文件夹中的一个名为"general.py“的模块中执行一个函数。

第一个文件夹(C:\Test\System)包含一个名为"entry.py“的文件,该文件从所有这些子文件夹中导入.py模块:

代码语言:javascript
复制
from intercepts.utils1 import general
from intercepts.utils1 import foobar
from intercepts.utils2 import ...
..etc..

下面是执行上述模块的C#代码,然后尝试在\utils1 1文件夹中调用一个名为"general.py“的模块中名为”general.py“的函数:

代码语言:javascript
复制
const string EntryModule = @"C:\Test\System\entry.py";

using (Py.GIL())
{
    using (var scope = Py.CreateScope())
    {
        var code = File.ReadAllText(EntryModule);
        var scriptCompiled = PythonEngine.Compile(code, EntryModule);
        scope.Execute(scriptCompiled);

        dynamic func = scope.Get("general.startup");
        func();
    }
}

不过,我在PythonException行上得到了一个scope.Execute(...),其中包含以下消息:

代码语言:javascript
复制
No module named 'intercepts'
File "C:\Test\System\entry.py", line 1, in <module>
   from intercepts.utils1 import general

我可以使用IronPython (Python2.7)完成类似的操作,所以我假设我对Python.Net做了一些错误(而不是改变了Python3.x中包的工作方式)。

顺便说一下,我正在使用pythonnet3.0.0 NuGet包。

编辑我尝试导入"entry.py“模块如下:

代码语言:javascript
复制
dynamic os = Py.Import("os"); 
dynamic sys = Py.Import("sys");                   
sys.path.append(os.path.dirname(EntryModule)); 
Py.Import(Path.GetFileNameWithoutExtension(EntryModule));

现在它似乎有了进一步的发展,但是有一个新的问题:

在"entry.py“模块中,您可以看到它首先导入一个称为"general”的模块,然后导入一个名为"foobar“的模块。"foobar.py“包含行import general。当我运行C#时,堆栈跟踪现在如下所示:

代码语言:javascript
复制
No module named 'general'
File "C:\Test\System\intercepts\utils1\foobar.py", line 1, in <module>
import general
  File "C:\Test\System\entry.py", line 2, in <module>
from intercepts.utils1 import foobar

为什么第二个导入的模块("foobar")不能“看到”前面导入的模块("general")?我是否甚至通过使用Py.Import()来解决我原来的问题而找到了正确的树呢?

EN

回答 1

Stack Overflow用户

发布于 2022-09-14 14:41:22

结果表明,与2相比,Python3处理导入的方式发生了变化,而且与Python.Net无关。

在我的"foobar.py“模块中,我不得不将import general更改为from . import general这里解释了这个问题,但我在下面包含了相关部分:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73715263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档