正如您在屏幕截图中所示,
root = $Project::NewIngestionPath;
这不会是正确的 python,因为我们在那里不使用分号。 Python 引擎也不知道如何使用
$Project::NewIngestionPath
,因为这是 SSIS 的事情。
您缺少的部分在您的第一张图片中:
Arguments
执行进程任务接受被调用进程的参数。现在运行时,它类似于
cd C:\Python
"C:\Program Files\Python310\python.exe" C:\Python\Pre_Ingestion_Fix_Script.py
您想要做的是添加另一个参数
"C:\Program Files\Python310\python.exe" C:\Python\Pre_Ingestion_Fix_Script.py \\server\path\to\new\ingestion
由于一些原因,这变得很棘手。首先,当涉及空格时,DOS 命令参数会变得很奇怪,因为传统上空格被解释为下一个参数。有些工具在调用 CMD.exe 时只能注入一组双引号参数,老实说我不记得 SSIS 在这种情况下是如何工作的。进一步搅浑水的是,我们为执行流程任务提供了
Arguments
选项,或者您也可以使用 StandardInputVariable
。您可以通过使用“执行流程任务”上的“表达式”选项卡提供所需的值来使事情变得更加复杂。
我会在 SSIS 中创建一个名为
CommandArguments
的 String 类型变量。在变量的表达式部分,我将使用以下内容
"C:\Python\Pre_Ingestion_Fix_Script.py " + $Project::NewIngestionPath
结果值将类似于
C:\Python\Pre_Ingestion_Fix_Script.py \server\路径 o ew\摄入
您可以在执行流程任务上放置一个断点,并目视检查
@[User::CommandArguments]
的值,它们看起来正确吗?它们应该与变量的设计时值相同,但这很重要,因为我们将在任务上使用表达式,并且没有机会检查表达的值,它是隐藏的。
在最佳情况下,您可以简单地删除 Arguments 中的内容,然后在 StandardInputVariable 的下拉框中选择我们的 CommandArguments。运行该包并查看它是否按预期工作。您的 python 包应该有一些日志记录,以便您可以检查命令行参数的结果。
如果失败,则从 StandardInputVariable 中删除该变量,然后单击“表达式”选项卡。将我们的变量连接到 Arguments 并再次运行包,它有效吗
其中一个应该,我只是不能肯定地说,因为还有很多其他地方可能会出错(权限、项目参数的实际值等),但这就是将项目参数传递到调用中的方式一个 python 文件。
最后,
root = $Project::NewIngestionPath
不起作用,因此我们需要调整脚本以访问运行时提供的参数。这是我们的朋友 sys.argv
import sys
root = sys.argv[1]
# rest of code here