我目前正在研究用C#编写的应用程序,我正在将IronPython嵌入其中.我通常没有任何问题,但有一件事我不知道如何处理.
我想将外部模块导入脚本.我怎样才能做到这一点?简单import ext_lib不起作用.我应该添加lib的路径sys.path吗?也许有可能将lib的.py文件复制到app目录并从那里导入?
编辑:
我最终选择了另一个解决方案 - 编译我的脚本,py2exe我只是从主C#app运行它Process(不使用IronPython).
无论如何,谢谢你的帮助;)
现在我正在开发在Windows上运行的C#app.一些进程是用Python编写的,通过pythonnet(Python for .NET)调用.这些过程计算量很大,所以我想并行完成.
它们是CPU限制的,可以独立处理.
据我所知,有两种可能的方法来实现它:
启动多个Python运行时
第一种方法是启动多个Python解释器,但似乎不可行.因为pythonnet通常只能管理一个由静态方法初始化的解释器,PythonEngine.Initialize().
从Python.NET文档:
嵌入器的重要说明: Python不是自由线程的,它使用全局解释器锁来允许多线程应用程序与Python解释器安全地交互.有关此内容的更多信息,请参见www.python.org网站上的Python C-API文档.
在托管应用程序中嵌入Python时,您必须像在C或C++应用程序中嵌入Python一样管理GIL.
在与Python.Runtime命名空间提供的任何对象或API交互之前,调用代码必须通过调用PythonEngine.AcquireLock方法获取Python全局解释器锁.此规则的唯一例外是PythonEngine.Initialize方法,可以在启动时调用,而无需获取GIL.
在Python中使用多处理包
另一种方法是使用多处理包.根据Python文档,如果代码在Windows上运行以确保生成有限进程,则必须使用以下语句:
if __name__ == "__main__":
但是,用Python编写的函数作为模块的一部分,因为它嵌入到.NET中.
例如,以下代码是可执行的,但无限生成进程.
//C#
static void Main(string[] args)
{
using (Py.GIL())
{
PythonEngine.Exec(
"print(__name__)\n" + //output is "buitlins"
"if __name__ == 'builtins':\n" +
" import test_package\n" + //import Python code below
" test_package.async_test()\n"
);
}
}
Run Code Online (Sandbox Code Playgroud)
# Python
import concurrent.futures
def heavy_calc(x):
for i in range(int(1e7) * x):
i*2
def async_test():
# multiprocessing
with concurrent.futures.ProcessPoolExecutor(max_workers=8) as executor:
futures = [executor.submit(heavy_calc,x) for x …Run Code Online (Sandbox Code Playgroud) 我开始从事机器学习,发现很多代码都是公开的.
在深入介绍之前,我想找到一些将Python代码合并到C#项目中的方法.
任何人都可以帮助我吗?
提前致谢