传递很长的列表作为sys.argv(pvpython到python)

问题描述 投票:0回答:1

错误:

OSError:[Errno 7]参数列表太长

历史:

在pvpython上运行脚本(vtk);但是在较旧的发行版pvpython <5.0上,matplotlib模块已经过时,因此无法使用该模块。为了克服这个问题,使用另一个.py并使用subprocess在终端中传递参数,如下所示并在python上运行,但由于传递的信息很大,因此满足上述错误。

有问题的代码是:

import subprocess
command = ("python illustrations.py %s %s %s %s %s %s %s %s %s %s" % (str(post_processing), str(width), str(height), str(len(new_overall_lines)), str(reset_scale), str(str_rose_angle), str(str_damage), str(fname), str(fname1), str("ax=None")))
subprocess.Popen(command, stdout=subprocess.PIPE, shell=True)

argv 6和7每个字符都非常冗长(882770,879326),因为它们是列表。

另一种解决方案是将列表传递给临时文件并将其加载到python模块中。但我试图节省写入和加载时间。

因此,我正在寻找一种方法来传递终端中的大型参数或如何传递两个环境的参数,在本例中是pvpython和python。

python python-2.7 subprocess argv pvpython
1个回答
0
投票

一个直接可见的可能原因是,在构造命令行时,根据系统shell的语法,您没有使用正确的引用和转义。因此,如果你的参数的字符串表示有空格或特殊的shell字符,那么它将被误解为许多参数(或更糟)。

因此,不要使用shell=True(不推荐专门用于此原因!)并通过适当的参数列表调用您的程序:

command = ["python", "illustrations.py"] +
          [str(v) for v in post_processing, width, height,
                            len(new_overall_lines), reset_scale,
                            str_rose_angle, str_damage,
                            fname, fname1] +
          ["ax=None"]

subprocess.Popen(command, stdout=subprocess.PIPE)

此外,由于命令行传递是特定于操作系统的(例如在Windows中,无论如何你的数组将被组合成一条线,因为这是CreateProcess需要命令行传递的方式)和individual command line arguments are also subject to length limits,更好的解决方案是通过通过命令行以外的方式任意长数据。

有以下方法将信息传递给子进程:

  • 命令行
  • 文件(因为filesystem是共享资源,with due protection considerations from other processes
  • IPC(管道包括标准流,共享内存,插槽等)
  • 通过fork()继承的东西: 内存快照(仅在子节点运行相同程序时适用) 描述符(标准流也在这里;请注意,Python默认标记除标准流之外的文件描述符不可继承) 环境变量

如您所见,命令行参数远非唯一的方法。

© www.soinside.com 2019 - 2024. All rights reserved.