我有一个小的python脚本,它通过一个网页(http-crawling)。此Web页面托管在Intranet内,并使用NTLM身份验证来收集对它的访问。
所以,我发现这个任务(检索http-content)可以使用python轻松编程,而不是试图将整个python脚本重写为C#,然后通过SSIS上的“脚本任务”使用它,以完成任务。
我仔细查看了SSIS工具,发现有一个名为“执行进程任务”的控制流,它允许您执行Win32可执行文件。
但问题在于如何调用我的python脚本,因为它不可执行,需要由python解释器解释(如果你原谅重复)。因此,我可以很容易地构建一个简单的“.bat”文件,该文件同时调用python脚本和解释器。然后通过SSIS“执行进程任务”执行该文件。
还有其他方法可以实现吗? (整洁的方式)
从脚本中检索的信息将从数据库中将该信息存储到表中,以便通过另一个SSIS进程的数据库表访问该信息。
我正在从不同来源(平面文件,数据库表,http请求......)中检索信息,以便将该信息存档到可以在Web服务中发布然后从Excel项目访问的数据库中
提前致谢!
答案 0 :(得分:3)
从SSIS的范围来看,使用IronPython的最简单的机制是调用外部进程并转储到文件,然后将其用作数据流的源。
也就是说,我能够从C#托管IronPython应用程序,并使用返回的数据填充输出缓冲区并与管道中的数据进行交互。我只有一台机器可以执行此操作,所以我列出了我记得要做的所有事情,直到包装变绿。
这篇文章让我了解了如何使这项工作成为可能。 Hosting IronPython in a C# 4.0 program我强烈建议您创建一个C#/ VB.NET控制台应用程序,并让您的IronPython集成首先在那里工作,因为SSIS将为所有内容添加一个额外的层。
可能有能力在C#中托管旧版本的IronPython而不需要4.0框架,但这远远超出了我的能力范围。我可以说的是,要使用4.0框架,您正在查看SQL Server 2012. 2008包可以达到3.5框架(默认为2.0)。
Global Assembly Cache,简称GAC。它是Windows中一个特殊的地方,签名的程序集可以存在。 SSIS可能能够使用不在GAC中的程序集,但我没有运气这样做。这个案子也不例外。我的控制台应用程序工作正常,但当我将该代码复制到SSIS时,它会出现Could not load file or assembly 'Microsoft.Scripting...
错误消息。幸运的是,IronPython-2.7.2.1(可能还有以前的版本)是强烈签名的dll。这意味着您可以而且必须将它们添加到GAC中。
在Visual Studio目录中,查找Visual Studio命令提示符(2010)。
假设您的IronPython安装文件夹为C:\tmp\IronPython-2.7.2.1\IronPython-2.7.2.1
,您可以键入cd C:\tmp\IronPython-2.7.2.1\IronPython-2.7.2.1
然后我注册了以下3个程序集
C:\tmp\IronPython-2.7.2.1\IronPython-2.7.2.1>gacutil -if Microsoft.Dynamic.dll
Microsoft (R) .NET Global Assembly Cache Utility. Version 4.0.30319.1
Copyright (c) Microsoft Corporation. All rights reserved.
Assembly successfully added to the cache
C:\tmp\IronPython-2.7.2.1\IronPython-2.7.2.1>gacutil -if IronPython.dll
Microsoft (R) .NET Global Assembly Cache Utility. Version 4.0.30319.1
Copyright (c) Microsoft Corporation. All rights reserved.
Assembly successfully added to the cache
C:\tmp\IronPython-2.7.2.1\IronPython-2.7.2.1>gacutil -if Microsoft.Scripting.dll
Microsoft (R) .NET Global Assembly Cache Utility. Version 4.0.30319.1
Copyright (c) Microsoft Corporation. All rights reserved.
Assembly successfully added to the cache
我的SSIS项目,我已将Run64bitRuntime设置为False,但在重新测试时,无关紧要。默认为True,这似乎工作正常。
Python脚本 - 我没有足够的背景来使C#和.NET DLR语言之间的集成更加优雅。提供一个包含我想要执行的脚本的字符串或其他东西真是太好了,也许这就是脚本块的内容,但我没有时间去调查。因此,此解决方案需要一个脚本文件位于磁盘上的某个位置。我在使用托管脚本进行导入时遇到了麻烦(没有名为X exception的模块)。毫无疑问,类路径和所有需要提供给主机的东西才能使其运行良好。这可能是一个不同的SO问题btw。
我有一个文件位于C:\ ssisdata \ simplePy.py
# could not get a simple import to work from hosted
# works fine from "not hosted"
#import os
def GetIPData():
#os.listdir(r'C:\\')
return range(0,100)
将脚本任务添加到数据流后,我将其配置为在输出缓冲区(wstr 1000)上有一个列。然后我用它作为我的源代码。
using System;
using System.Collections.Generic;
using System.Data;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;
using IronPython.Hosting;
using Microsoft.Scripting.Hosting;
/// <summary>
/// Attempt to use IP script as a source
/// http://blogs.msdn.com/b/charlie/archive/2009/10/25/hosting-ironpython-in-a-c-4-0-program.aspx
/// </summary>
[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
/// <summary>
/// Create data rows and fill those buckets
/// </summary>
public override void CreateNewOutputRows()
{
foreach (var item in this.GetData())
{
Output0Buffer.AddRow();
Output0Buffer.Content = item;
}
}
/// <summary>
/// I've written plenty of code, but I'm quite certain this is some of the ugliest.
/// There certainly must be more graceful means of
/// * feeding your source code to the ironpython run-time than a file
/// * processing the output of the code the method call
/// * sucking less at life
/// </summary>
/// <returns>A list of strings</returns>
public List<string> GetData()
{
List<string> output = null;
var ipy = Python.CreateRuntime();
dynamic test = ipy.UseFile(@"C:\ssisdata\simplePy.py");
output = new List<string>();
var pythonData = test.GetIPData();
foreach (var item in pythonData)
{
output.Add(item.ToString());
}
return output;
}
}
快速拍摄我的参考资料
点击“运行”按钮,取得巨大成功
答案 1 :(得分:2)
我能想到的一件事是将所有文件路径添加到sql表并使用xp_cmdshell执行它们
你需要在sql实例上启用它(我假设你有一个,因为你正在考虑使用SSIS)
EXEC sp_configure 'show advanced options', 1
GO
reconfigure
go
EXEC sp_configure 'xp_cmdshell', 1
GO
reconfigure
go
比你可以在表上循环并且每行执行:
exec master.dbo.xp_cmdshell 'your_script'
答案 2 :(得分:2)
简单的解决方案(没有.bat):
在“执行流程任务”的编辑器中,将 Exectutable 设置为Python解析器
C:\...\Python34\python.exe
Arguments 首先设置脚本路径,然后设置脚本的任何args
H:\...\test\helloworld.py -a 1 -b 2
不要忘记 WorkingDirectory
H:\...\test