我读过与通过Python将SON文本作为命令行参数传递有关的类似问题,但没有一个解决方案适用于我的 case .

我正在自动化Python脚本,自动化运行一个Powershell脚本,该脚本采用从power automated流生成的杨森对象.一切都运行得很好,直到在我的Python脚本中处理Python.

我的目标是将SON转换为字典,以便我可以在代码中使用关键字对.

我的Powershell脚本看起来像这样:


Python script.py {"Items":[{"Name":"foo","File":"\\\\files\\foo\\foo.csv"},{"Name":"bar","File":"\\\\files\\bar\\bar.csv"},{"Name":"baz","File":"\\\\files\\baz\\baz.csv"}]}

我的JSON看起来是这样的:

{
    "Items": [
        {
            "Name": "foo",
            "File": "\\\\files\\foo\\foo.csv"
        },
        {
            "Name": "bar",
            "File": "\\\\files\\bar\\bar.csv"
        },
        {
            "Name": "baz",
            "File": "\\\\files\\baz\\baz.csv"
        }
    ]
}

我try 了SO的这个解决方案:

if len(sys.argv) > 1:
        d = json.loads(sys.argv[1])
        print(d)

但它返回这个错误:

Unexpected token ':' in expression or statement.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : UnexpectedToken

我不确定如何解决这个问题,任何建议都会有所帮助!

推荐答案

根据您使用的Shell版本,您需要以不同的方式处理它,如果使用pwsh 7.3+,则解决方案就像用单引号包裹Json字符串一样简单.否则,如果使用低于该值,则需要用\来进行双引号,否则这些双引号在通过Python脚本传递时会被吃掉.

使用这个可以动态处理它:

$json = @'
{
    "Items": [
        {
            "Name": "foo",
            "File": "\\\\files\\foo\\foo.csv"
        },
        {
            "Name": "bar",
            "File": "\\\\files\\bar\\bar.csv"
        },
        {
            "Name": "baz",
            "File": "\\\\files\\baz\\baz.csv"
        }
    ]
}
'@

if ($PSVersionTable.PSVersion -ge '7.3') {
    Python script.py $json
}
else {
    Python script.py $json.Replace('"', '\"')
}

然后假设您的Python代码是:

import json
import sys

if len(sys.argv) > 1:
    d = json.loads(sys.argv[1])
    for i in d['Items']:
        print(i)

那么您的PowerShell控制台中的输出将是:

{'Name': 'foo', 'File': '\\\\files\\foo\\foo.csv'}
{'Name': 'bar', 'File': '\\\\files\\bar\\bar.csv'}
{'Name': 'baz', 'File': '\\\\files\\baz\\baz.csv'}

一个更简单且可能更强大的替代方案,在任何版本的Shell中都不需要进行引号的逸出,那就是将Json字符串转换为Shell中的Base 64,并将其作为参数传递给Python脚本:

# Json defined here
$json = @'
...
...
'@

$b64 = [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($json))
Python script.py $b64

然后在Python中,代码只需进行最小的更改即可工作:

from base64 import b64decode
import json
import sys

if len(sys.argv) > 1:
    d = json.loads(b64decode(sys.argv[1]))
    for i in d['Items']:
        print(i)

Python相关问答推荐

有条件地采样我的大型DF的最有效方法

如何通过多2多字段过滤查询集

如何调整spaCy token 化器,以便在德国模型中将数字拆分为行末端的点

对某些列的总数进行民意调查,但不单独列出每列

类型错误:输入类型不支持ufuncisnan-在执行Mann-Whitney U测试时[SOLVED]

通过Selenium从页面获取所有H2元素

使可滚动框架在tkinter环境中看起来自然

avxspan与pandas period_range

不能使用Gekko方程'

Flash只从html表单中获取一个值

寻找Regex模式返回与我当前函数类似的结果

在不同的帧B中判断帧A中的子字符串,每个帧的大小不同

为什么常规操作不以其就地对应操作为基础?

Python—压缩叶 map html作为邮箱附件并通过sendgrid发送

Gekko中基于时间的间隔约束

递归函数修饰器

如何训练每一个pandaprame行的线性回归并生成斜率

如何在Python中解析特定的文本,这些文本包含了同一行中的所有内容,

时长超过24小时如何从Excel导入时长数据

我如何处理超类和子类的情况