我花了很长时间寻找一种能够将类似于matplotlib的功能带到.NET框架的产品.据我所知,没有什么能真正起作用.这是一个准确的评估吗?这是我发现的:
商业:
开源:
我认为拥有一个.NET项目非常有价值,它提供了交互式绘制F#和IronPython等语言数据的能力.有谁知道这样的项目?
您是否会推荐使用Iron Ruby,Iron Python或PowerShell来使C#应用程序成为脚本宿主?
经过一些快速的修补,现在我倾向于PowerShell有两个主要原因(注意这些纯粹是我的意见,如果他们错了,我很想知道!!!):
1)在应用程序中创建包含类的运行空间很简单; 因此,您可以轻松地编写应用程序脚本.
2)我听说有一些传言说IronRuby和IronPython正在失去微软的支持,所以他们可能是一个糟糕的长期解决方案?
由于这是我第一次在应用程序中添加脚本,我欢迎所有可以从以前走过这条路的人那里得到的建议.
具体来说,除了让我知道你是否同意我的上述两点之外,我想知道IronRuby和IronPython是否比PowerShell更容易使用(对于用户而不是开发人员),如果您使用DLR的经验是就像将对象传递给powershell运行空间一样简单?如果我添加了对DLR和IR/IP脚本的支持,我的应用程序是否仍然可以向后兼容XP?
我将这个问题加上前缀:不,设置IRONPYTHONPATH不是答案.
无论如何...
我计划使用IronPython作为项目的Powershell的替代品,但在我开始之前我一直都很难过.
我尝试做的第一件事是使用os.path,结果是:
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: No module named os
Run Code Online (Sandbox Code Playgroud)
搞砸了我终于发现我可以通过手动添加到路径来使用标准库:
import sys
sys.path.append(r"C:\Program Files\IronPython 2.7\Lib")
import os
Run Code Online (Sandbox Code Playgroud)
然而,这是一个愚蠢的想法.在我的脚本中硬编码python库的路径是一种100%保证的方式,使它们在某些时候不起作用.
当我尝试在Windows 7机器上使用脚本并且路径略有不同时('Program Files(x86)'),我几乎立即发现了这一点.
所以,这里有几个问题:
1)为什么使用标准库这么难?至少我会想到VS中的交互式提示和基本的ipy.exe会有这个.
2)无论我使用何种系统,如何确定安装铁python的目录?(IronPython安装程序设置var也许?)
这里只是一个注释; 是的,我看过其他一些帖子说"设置你的IRONPYTHONPATH".这无益.如果我有一台空机,这意味着我必须:
1)安装IronPython
2)运行一些疯狂的PowerShell脚本来搜索标准库的安装位置,并为其设置一个全局IRONPYTHONPATH变量.
3)运行python脚本
我正在寻找更好的方法.
-
编辑:
事实上,我使用它来做类似于powershell的事情基本上是无关紧要的,但我正在尝试实现类似的东西:
import clr
from System.Management.Automation import RunspaceInvoke
import os
scriptRoot = os.getcwd()
runSpace = RunspaceInvoke()
cmdPath64 = os.join(scriptRoot, "..\java\...")
cmdPath32 = os.join(scriptRoot, "..\java\...")
proc = runSpace.Invoke("Get-WmiObject Win32_Processor ... ")
if proc.AddressWidth == 32: …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序具有在某些窗口中使用的多个用户控件.其中一个用户控件定义此窗口中的所有其他用户控件是否应允许编辑,因此将IsEnabled属性设置False为所有CheckBoxes,ComboBoxes和Buttons.但是,TextBoxes应该允许复制它们的文本,因此不应该被禁用,而只能是只读的.
我试过遍历LogicalTree,但是一些自建的usercontrol没有任何属性来禁用它们,但是这个usercontrol中包含的控件只是按钮和文本框.这就是为什么我想申请一个风格多变的所有元素(CheckBox,ComboBox,Button和TextBox),但它不会工作.
在usercontrol的Ressources部分中,我定义了一些样式:
<Style TargetType="Control" x:Key="disabledStyle">
<Setter Property="IsEnabled" Value="False" />
</Style>
<Style TargetType="TextBox" x:Key="readOnlyStyle">
<Setter Property="IsReadOnly" Value="True" />
</Style>
Run Code Online (Sandbox Code Playgroud)
在CodeBehind中,在检查条件后,我尝试了以下方法:
# windowOwner is the root window containing this usercontrol
for control in [Button, ComboBox, CheckBox]:
if self.windowOwner.Resources.Contains(control):
self.windowOwner.Resources.Remove(control)
self.windowOwner.Resources.Add(control, self.Resources['disabledStyle'])
if self.windowOwner.Resources.Contains(TextBox):
self.windowOwner.Resources.Remove(TextBox)
self.windowOwner.Resources.Add(TextBox, self.Resources['readOnlyStyle'])
Run Code Online (Sandbox Code Playgroud)
但什么都没发生.我究竟做错了什么?我应该采用不同的方式吗?
=编辑1 =============================================== ===================
我现在尝试了以下,XAML:
<Style x:Key="disabledStyle">
<!--<Setter Property="Button.IsEnabled" Value="False" /> …Run Code Online (Sandbox Code Playgroud) 感谢上一个问题的建议,我正忙着尝试使用IronPython,IronRuby和Boo为我的C#应用程序创建一个DSL.由于更大的用户和知识库,第一步是IronPython.如果我能在这里找到合适的东西,我可以停下来.
这是我的问题:
我希望我的IronPython脚本可以访问名为Lib的类中的函数.现在我可以将程序集添加到IronPython运行时并通过执行我创建的作用域中的语句来导入该类:
// load 'ScriptLib' assembly
Assembly libraryAssembly = Assembly.LoadFile(libraryPath);
_runtime.LoadAssembly(libraryAssembly);
// import 'Lib' class from 'ScriptLib'
ScriptSource imports = _engine.CreateScriptSourceFromString("from ScriptLib import Lib", SourceCodeKind.Statements);
imports.Execute(_scope);
// run .py script:
ScriptSource script = _engine.CreateScriptSourceFromFile(scriptPath);
script.Execute(_scope);
Run Code Online (Sandbox Code Playgroud)
如果我想运行Lib :: PrintHello,这只是一个hello world style语句,我的Python脚本包含:
Lib.PrintHello()
Run Code Online (Sandbox Code Playgroud)
或(如果它不是静态的):
library = new Lib()
library.PrintHello()
Run Code Online (Sandbox Code Playgroud)
如何更改我的环境,以便我可以在Python脚本中获得如下的基本语句:
PrintHello
TurnOnPower
VerifyFrequency
TurnOffPower
etc...
Run Code Online (Sandbox Code Playgroud)
我希望这些脚本对于非程序员来说很简单.我不希望他们必须知道课程是什么或它是如何工作的.IronPython真的就在那里,所以像for,do,if和基本函数定义这样的基本操作不需要我为我的DSL编写编译器.
单元测试与生产代码有不同的要求.例如,单元测试可能不必像生产代码那样高效.
也许有时用一种更适合编写单元测试的语言编写单元测试是有意义的吗?我想到的具体示例是在C#中编写应用程序,但使用IronRuby或IronPython编写测试.
在我看来,使用IronPython和IronRuby比C#代码作为测试语言有几个优点:
使用两种不同语言进行测试和生产代码的权衡是什么?
我在我的宠物开源项目RevitPythonShell(建筑建模软件Autodesk Revit Architecture 2010的插件)中尝试了明显的路径:code.interact()使用IronPython引擎设置为STDIN和使用.NET流STDOUT.然后我将这些重定向到TextBox控件.它有点工作,但真的只是一个丑陋的黑客.
主要问题是让所有shell工作正常工作:历史记录的上箭头和下箭头,编辑,复制和粘贴,EOF,语法高亮,工具提示等.要做到这一点需要做很多工作,而且它并不是我想要解决的问题(我正在尝试在Revit中托管交互式shell,而不是制作完美的shell GUI).
如果这不是一个.NET项目,我可能会考虑重用PyCrust/PyWrap,但我不确定是否可以从WinForms项目中完成..NET有什么类似的东西吗?
有没有人实现过IConsole界面,可以展示我需要做什么的例子?看起来这将是正确的路线(而不是使用code模块),但对于我的生活,我无法弄明白.IronPython源代码没有任何评论.
更新:在尝试了一些东西后,我最终选择了精湛的IronLab代码.它包括一个带语法高亮的示例shell和all.代码很好,易于集成.检查有关如何嵌入它的提示的RevitPythonShell代码.
我将IronPython(2.6.1)嵌入到C#程序集中,并将几个对象暴露给使用PythonEngine.ExecuteFile执行的脚本.我暴露他们
scope.SetVariable("SomeObject", new SomeObject())
Run Code Online (Sandbox Code Playgroud)
要么
engine.Execute("from MyNamespace import SomeObject", scope)
Run Code Online (Sandbox Code Playgroud)
取决于脚本如何使用它们.我的应用程序组件被添加到引擎中
engine.Runtime.LoadAssembly(Assembly.GetExecutingAssembly())
Run Code Online (Sandbox Code Playgroud)
现在一个脚本可以执行help(SomeObject)并转储好的小帮助信息(*),但它不完整.没有任何对象的事件或属性(当然是公共的)出现,许多"内置"成员也会丢失.
这是奇怪的部分; 如果我启动ipy.exe并执行以下操作:
import sys
sys.path.append('<location of my app>')
import clr
clr.AddReferenceToFile('myapp.exe')
from MyNamespace import SomeObject
help(SomeObject)
Run Code Online (Sandbox Code Playgroud)
我得到了一个不同的转储,包括所有缺少的成员!
为什么两者不同?
奖金问题:假设我让它正常工作,是否可以在我的CLR对象上添加描述性文本到help()的输出?就像你可以在脚本中,你的python本地类型?我的第一个猜测是DescriptionAttribute,但是没有用.
(*)显然,最终的工作脚本不会这样做,但在编写/测试脚本时它非常有用.
回答
这是一个完整的控制台程序,演示了如何导入网站,用标准的python库help()替换无用的内部help().
using System;
using System.Collections.Generic;
using System.Reflection;
using IronPython.Hosting;
using IronPython.Runtime;
using Microsoft.Scripting.Hosting.Providers;
namespace MyApp
{
class Program
{
static void Main(string[] args)
{
// Work around issue w/ pydoc - piping to more doesn't work so instead indicate that we're …Run Code Online (Sandbox Code Playgroud) 我有一些IronPython从C#应用程序中调用的代码.
这段代码工作正常,直到我决定更改一个函数在一个线程中运行.
当在python线程中调用numpy函数时,InsufficientMemoryException抛出异常.
我搜索了解决方案,但没有找到.有人可以解释为什么会发生这种情况,我该如何解决?
我认为只有当我有两个线程使用时才会发生这种情况 numpy
我运行这样的代码:
C#:
_python.functionA(); # _python was created with "Python.CreateEngine()"
_python.functionA(); # twice on purpose
Run Code Online (Sandbox Code Playgroud)
Python:
my_python_script.py
import threading
import time
import numpy
def blah():
print numpy.array([100,100,0])
def functionA():
t = threading.Timer(0,blah)
t.start()
time.sleep(2)
Run Code Online (Sandbox Code Playgroud)
我得到了这个例外:
Exception in thread Thread-1:
Traceback (most recent call last):
File "c:\Program Files\IronPython 2.7.1\Lib\threading.py", line 552, in _Thread__bootstrap_inner
self.run()
File "c:\Program Files\IronPython 2.7.1\Lib\threading.py", line 756, in run
self.function(*self.args, **self.kwargs)
File "C:\workspace\my_python_script.py", line 113, in blah …Run Code Online (Sandbox Code Playgroud) 我认为这是以前最流行的方式:
https://pytools.codeplex.com/wikipage?title=NumPy%20and%20SciPy%20for%20.Net
但是这个链接不再存在:
https://store.enthought.com/repo/.iron/
我最近找到了该指令的克隆,并在github上找到了ironpkg-1.0.0.py的克隆.但http://www.enthought.com/repo/.iron/eggs/index-depend.txt已不再存在于互联网上(我用Google搜索,但未找到它)
SciPy for .NET入门
1.)IronPython下载并安装IronPython 2.7,这将需要.NET v4.0.
2.)修改PATH
在路径上添加安装位置,通常是:C:\ Program File\IronPython 2.7
但在64位Windows系统上,它是:C:\ Program File(x86)\ IronPython 2.7
作为检查,打开Windows命令提示符并转到目录(不是上面的目录)并键入:
在.NET 4.0.30319.225上的ipy -V PythonContext 2.7.0.40
3.)ironpkg
Bootstrap ironpkg,它是二进制(基于蛋)Python包的包安装管理器.下载ironpkg-1.0.0.py并键入:
ipy ironpkg-1.0.0.py --install
现在应该可以使用ironpkg命令:ironpkg -h(此处显示一些有用的帮助文本)
4.)scipy
现在安装scipy很简单:
ironpkg scipy numpy-2.0.0b2-1.egg
我想我已尽我所能做到了.任何机构成功为Ironpython27安装numpy和scipy?
ironpython ×10
c# ×8
.net ×4
python ×4
embedding ×2
numpy ×2
dsl ×1
f# ×1
ironruby ×1
powershell ×1
scipy ×1
shell ×1
unit-testing ×1
wpf ×1
xaml ×1