代码之家  ›  专栏  ›  技术社区  ›  Chris Adams

通过命令行将字典传递给Python脚本

  •  5
  • Chris Adams  · 技术社区  · 15 年前

    我的选择是:
    一) 构建一个模块,从字符串解析字典(比我希望的更深入)。
    二) 使用临时文件编写pickle,并将文件名作为参数传递

    解决方案不必是用户友好的,但需要是程序友好的。出于安全和资源考虑,第二个程序必须作为单独的进程运行。

    6 回复  |  直到 15 年前
        1
  •  6
  •   FogleBird    15 年前

    除了 pickle ,另一种选择是 ast.literal_eval ,如果您的字典只包含Python原语。

    >>> d = {3: 9, 'apple': 'orange'}
    >>> s = str(d)
    >>> s
    "{3: 9, 'apple': 'orange'}"
    >>> import ast
    >>> x = ast.literal_eval(s)
    >>> x
    {3: 9, 'apple': 'orange'}
    
        2
  •  8
  •   Mike DeSimone    15 年前

    你看过那张照片了吗 pickle 通过stdout/stdin传递数据的模块?

    例子:

    骑士.py:

    import pickle
    import sys
    
    desires = {'say': 'ni', 'obtain': 'shrubbery'}
    pickle.dump(desires, sys.stdout)
    

    圆桌会议.py:

    import pickle
    import sys
    
    knightsRequest = pickle.load(sys.stdin)
    for req in knightsRequest:
        print "The knights %s %s." % (req, knightsRequest[req])
    

    使用和输出:

    $ python knights.py | python roundtable.py
    The knights say ni.
    The knights obtain shrubbery.
    
        3
  •  6
  •   Ross Light    15 年前

    simplejson ? 它是一个内置模块(称为 json )在Python2.6及更高版本中。

        4
  •  2
  •   martineau    15 年前

    如果字典中的内容(键和值)可以表示为字符串,那么您应该能够将其作为字符串参数传递给第二个脚本,后者可以重新创建它。

    d = {'a':1,'b':2}
    
    d == eval(repr(d), None)
    
    >>>True
    

    编辑: 下面是一个稍微复杂一点的示例,展示了它在一个简单的自定义类中的用法:

    class MyClass:
        def __init__(self, a, b):
            self.a = a
            self.b = b
        def __repr__(self):
            return 'MyClass(%r, %r)' % (self.a, self.b)
        def __eq__(self, other):
            return (self.a == other.a) and (self.b == other.b)
    
    d = {'foo':42, 'bar': MyClass(17,'astring') }
    
    print 'd:', d
    print 'repr(d):', repr(d)
    print "d == eval(repr(d), {'MyClass':MyClass})?:", \
          d == eval(repr(d), {'MyClass':MyClass})
    
    # outputs:
    # d: {'foo': 42, 'bar': MyClass(17, 'astring')}
    # repr(d): {'foo': 42, 'bar': MyClass(17, 'astring')}
    # d == eval(repr(d), {'MyClass':MyClass})?: True
    
        5
  •  0
  •   esamatti    15 年前
        6
  •  0
  •   hluk    15 年前

    只需在一个python脚本中打印字典

    print( "dict=" + str(dict) )
    

    把它当作

    (python script1.py; cat script2.py) | python -