【问题标题】:How much data I can pass to a C++ program via its command line arguments?我可以通过命令行参数将多少数据传递给 C++ 程序?
【发布时间】:2017-06-14 12:26:11
【问题描述】:

我在用 C++ 和 python 编写的程序之间传递数据。

我发现最简单的方法之一是编译一个 C++ 程序,然后在 python 中使用subprocess.call('cprog.exe arg1 arg2', shell=True) 调用它,并通过参数arg1, arg2.... etc 传输数据

这避免了使用 Cython、boost……等等……我发现在 Windows 上工作是一个巨大的痛苦。特别是在未连接到互联网的老化服务器上​​。 (请不要回复试图帮助 cython 或 boost 等的帖子。我想将讨论限制在主要问题上。)

我的问题是:这种方法的局限性是什么?

我可以序列化/编码/解码整个数据数组并以这种方式通过命令行参数传递它们吗?几千兆字节的文件呢?

这会是比先写入硬盘再读取硬盘更快的方法吗?


编辑:这似乎是相关的: Maximum Length of Command Line String

【问题讨论】:

  • C++ 语言规范没有指定传递给main() 的命令行参数的最大大小。实际限制完全取决于您的操作系统。
  • 这取决于你的操作系统限制在哪里,但会有一个。将数据传递给子进程的常用方法是使用标准输入。
  • 根据您的回复,我更改了搜索词并发现:stackoverflow.com/questions/3205027/… 我认为其中包含答案!谢谢
  • IIRC cmd shell 的命令行限制为 8K 字符。但是,您提供的示例不需要 shell,因此如果您使用 shell=False,您可以将其增加到 Windows 的 32,766 个字符的限制。
  • 不使用shell=True 还具有此答案中指出的其他优点:stackoverflow.com/a/3172488/2305545

标签: python c++ cmd


【解决方案1】:

不是一个完整的答案(我无法评论任何硬性限制),但请记住,您在命令行上传递的任何数据都必须适合 内存,而且据我所知知道在该过程期间无法释放此内存...因此这不是共享千兆字节数据的实用方法。

当您使用shell=True 时,您构建的命令将由shell 解释,这可能(将)对接受的参数数量以及参数的大小施加其自己的一组限制。它还可能对参数可能消耗的总内存量施加限制。 说明您的操作系统/外壳可能会很有趣,以便其他人可以参与 - 由于您的标签,我怀疑 Windows 和 cmd.exe,但不能确定!


总的来说,这是一个坏主意,并且(尽管它不是您问题的答案),您应该认真考虑使用管道进行进程间通信 (IPC)。这将消除您的编码/解码开销、对大小限制的任何担忧以及对将数据写入磁盘的任何担忧。

【讨论】:

  • 太好了 - 谢谢!我现在会考虑使用管道。
【解决方案2】:

main的签名是

int main(int argc, const char** argv)

因此,您受到 argv 大小的限制,并且不能保证能够传递超过 32767 个参数。根据您的操作系统和机器,您之前可能会遇到其他限制,但这是语言中内置的限制。

请注意,对于任何给定的编译器,一个可能有更大的 int 大小,并且可能能够支持更多的参数,但这不受标准的保证。

【讨论】:

  • A) 参数是向后的 B) 为什么是 2147483647?
  • A) 哎呀 - 无论如何语义;) B) int 有一个明确定义的范围 - 或者你是说 argc 可能是负数?有趣
  • @NathanOliver 如果我们假设 int 是 32 位,那么 argc 的最大值将是 2147483647。
  • 我们不能假设 int 是 32 位。标准要求它的最大值必须是 16 位整数可以容纳的值,但它可以容纳的不止于此。 int 可能是 64 位,这会给您带来更大的价值。
  • 你忘了 shell 可以对命令行参数的数量设置比 int 的大小更低的限制。
猜你喜欢
  • 2010-12-01
  • 2010-10-04
  • 2021-11-29
  • 1970-01-01
  • 2013-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多