我可以通过命令行参数传递给C++程序多少数据?



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

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

这避免了使用Cython,提升...等。。。。我发现在窗户上工作是一个巨大的痛苦。尤其是在未连接到互联网的老化服务器上。(请不要回复这篇文章试图帮助cython或boost等 - 我想将讨论限制在主要问题上。

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

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

这是否比写入硬盘驱动器然后从硬盘驱动器读取更快?


编辑:这似乎是相关的: 命令行字符串的最大长度

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

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


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

main 的签名是

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

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

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

相关内容

最新更新