首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以sys.argv的形式传递非常长的列表(pvpython到python)

以sys.argv的形式传递非常长的列表(pvpython到python)
EN

Stack Overflow用户
提问于 2019-04-17 15:50:54
回答 1查看 686关注 0票数 0

错误:

OSError: Errno 7参数列表太长

历史:

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

有问题的代码是:

代码语言:javascript
复制
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)

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

另一种解决方案是将列表传递到临时文件中,并将这些文件加载到python模块中。但是我想节省写和加载的时间。

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

EN

回答 1

Stack Overflow用户

发布于 2019-04-17 16:18:14

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

因此,shell=True 不使用(因为这个原因不推荐使用!),并通过适当的参数列表调用程序:

代码语言:javascript
复制
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需要传递命令行的方式)和单个命令行参数也受长度限制。,一个更好的解决方案是通过命令行以外的方式传递任意长的数据。。

向子进程传递信息的方法如下:

  • 命令行
  • 文件(因为文件系统是共享资源,考虑到其他程序的适当保护)
  • IPC (包括管道)标准流、共享内存、套接字等)
  • 通过fork():继承的东西
    • 内存快照(仅在子程序运行相同程序时才适用)
    • 描述符(标准流也在这里;请注意,Python故意标记默认不可继承的标准流以外的文件描述符)。
    • 环境变量

正如您所看到的,命令行参数远不是唯一的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55731563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档