【问题标题】:Execute subprocess python script with arguments使用参数执行子进程 python 脚本
【发布时间】:2016-06-14 09:40:15
【问题描述】:

我有一个使用subprocess.Popen 调用其他python3 脚本的python3 脚本。
第一个脚本创建第二个脚本所需的 python 对象,第二个脚本将使用同一个对象运行几次。

现在看起来像这样:

for x in range(0,10):
    pid2 = subprocess.Popen([sys.executable, "try2.py"])

但是,我想将在第一个脚本中创建的 python 对象传递给子进程。 这可能吗?还是只能传递字符串参数?

谢谢。

【问题讨论】:

    标签: python subprocess popen


    【解决方案1】:

    根据documentation,Args 应该是字符串或字符串序列。但是,如果您确实想传递一个对象,您也许可以将该对象序列化为 JSON,然后在您的第二个脚本中将其反序列化以检索原始对象。然后您可以继续执行第二个脚本的操作

    【讨论】:

      【解决方案2】:

      我有一个 python3 脚本,它使用 subprocess.Popen 调用其他 python3 脚本

      哎哟

      第一个脚本创建第二个脚本所需的 python 对象,第二个脚本将使用同一个对象运行几次。

      哎哟^2

      但是,我想将在第一个脚本中创建的 python 对象传递给子进程。这可能吗?还是只能传递字符串参数?

      您只能传递字符串参数,但您可以在传递对象之前对其进行序列化。

      您介意分享更多有关您尝试解决的问题的信息,以便我们提出结构良好的可维护解决方案吗?

      也证明了在 python 中做如此扭曲的事情是多么容易:):

      python3:

      try1.py:

      import subprocess
      import sys
      import pickle
      import base64
      
      
      class X:
          def __init__(self):
              self.a = 2
      
      a = X()
      a.a = "foobar"
      
      subprocess.call([sys.executable, "try2.py", base64.encodestring(pickle.dumps(a))])
      

      try2.py:

      import sys
      import pickle
      import base64
      
      
      class X:
          def __init__(self):
              self.a = 2
      
      x = pickle.loads(base64.decodestring(bytes(sys.argv[1], "ascii")))
      print(x.a)
      

      【讨论】:

        猜你喜欢
        • 2013-11-02
        • 1970-01-01
        • 2016-09-27
        • 2021-04-02
        • 1970-01-01
        • 1970-01-01
        • 2013-10-21
        • 2021-12-26
        • 2020-10-09
        相关资源
        最近更新 更多