gpt4 book ai didi

python - 每个 PowerShell 调用 Python 脚本并传递 PSObject 并返回解析后的数据

转载 作者:行者123 更新时间:2023-12-04 08:30:22 24 4
gpt4 key购买 nike

一些背景:目前我正在使用 dbatools 从 MS SQL 服务器查询 4Mio 行(50 列)到 PSObject(每个查询批处理 10.000 行),使用 PowerShell(大量正则表达式)处理数据并用 SimplySql 写回 MariaDb .
平均而言,我得到大约。 150 行/秒。必须使用很多技巧(Net 的 Stringbuilder 等)才能获得这种性能,恕我直言还不错
作为新要求,我想检测某些文本单元格的语言,并且必须删除个人数据(姓名和地址)。为此,我找到了一些不错的 python 库( spacypycld2 )。
我用 pycld2 进行了测试 - 非常好的检测。
用于澄清的简化代码(提示:我是 python 菜鸟):

#get data from MS SQL
$data = Invoke-DbaQuery -SqlInstance $Connection -Query $Query -As PSObject -QueryTimeout 1800
for ($i=0;$i -lt $data.length;$i++){
#do a lot of other stuff here
#...
#finally make lang detection
if ($LangDetect.IsPresent){
$strLang = $tCaseDescription -replace "([^\p{L}\p{N}_\.\s]|`t|`n|`r)+",""
$arg = "import pycld2 as cld2; isReliable, textBytesFound, details = cld2.detect('" + $strLang + "', isPlainText = True, bestEffort = True);print(details[0][1])"
$tCaseLang = & $Env:Programfiles\Python39\python.exe -c $arg
} else {
$tCaseLang = ''
}
}
#write to MariaDB
Invoke-SqlUpdate -ConnectionName $ConnectionName -Query $Query
这个 python 调用每次都有效,但由于循环调用和每次导入 pycld2 lib,它会破坏性能(12 行/秒)。所以,这是一个蹩脚的解决方案:)
此外,如上所述 - 我想使用 spacy - 必须解析更多的列以摆脱个人数据。
我不确定,如果我有心情将整个 PS Parser 转换为 python :|
我相信,更好的解决方案可能是将整个 PSObject 从 PowerShell 传递到 python(在 PS 循环开始之前)并返回它以及 PSObject - 在它在 python 中处理之后 - 但我不知道,我怎么能用 python/python 函数实现这一点。
您的方法/建议是什么,还有其他想法吗?
谢谢 :)

最佳答案

以下简化示例向您展示了如何传递多个 [pscustomobject] ( [psobject] ) 从 PowerShell 到 Python 脚本的实例(在本例中通过 -c 作为字符串传递):

  • 来自 使用 JSON 作为序列化格式,通过 ConvertTo-Json ...
  • ...并传递该 JSON 通过管道 , 其中 Python 可以通过标准输入读取 (标准输入)。

  • 重要 :
  • 字符编码 :
  • PowerShell 使用 $OutputEncoding 中指定的编码向外部程序(例如 Python)发送数据时的偏好变量,在 PowerShell [Core] v6+ 中默认为无 BOM 的 UTF-8 值得称赞,但在 Windows PowerShell 中默认为 ASCII(!)。
  • 就像 PowerShell 限制您将文本发送到外部程序一样,它也总是将接收到的内容解释为文本,即基于存储在 [Console]::OutputEncoding 中的编码。 ;遗憾的是,在撰写本文时,两个 PowerShell 版本都默认使用系统的 OEM 代码页。
  • 在两个 PowerShell 版本中发送和接收(无 BOM)UTF-8 ,(暂时)设置 $OutputEncoding[Console]::OutputEncoding如下:$OutputEncoding = [Console]::OutputEncoding = [System.Text.Utf8Encoding]::new($false)

  • 如果你想要你的 Python 脚本 还要输出对象,再次考虑使用 JSON , 在 PowerShell 上,您可以使用 解析为对象 ConvertFrom-Json .
  • # Sample input objects.
    $data = [pscustomobject] @{ one = 1; two = 2 }, [pscustomobject] @{ one = 10; two = 20 }

    # Convert to JSON and pipe to Python.
    ConvertTo-Json $data | python -c @'

    import sys, json

    # Parse the JSON passed via stdin into a list of dictionaries.
    dicts = json.load(sys.stdin)

    # Sample processing: print the 'one' entry of each dict.
    for dict in dicts:
    print(dict['one'])

    '@

    如果要传递的数据是单行字符串的集合,则不需要 JSON:
    $data = 'foo', 'bar', 'baz'

    $data | python -c @'

    import sys

    # Sample processing: print each stdin input line enclosed in [...]
    for line in sys.stdin:
    print('[' + line.rstrip('\r\n') + ']')

    '@

    关于python - 每个 PowerShell 调用 Python 脚本并传递 PSObject 并返回解析后的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65049029/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com