我在用C ++和python编写的程序之间传递数据。
我发现最简单的方法之一是编译C ++程序,然后使用subprocess.call('cprog.exe arg1 arg2', shell=True)
在python中调用它,并通过参数arg1, arg2.... etc
传输数据
这可以避免使用Cython,boost ...等......我发现这对于在Windows上工作是一个巨大的痛苦。特别是在没有连接到互联网的老化服务器上。 (请不要回复这篇文章试图帮助cython或提升等等 - 我想限制讨论主要问题。)
我的问题是:这种方法有哪些限制?
我可以序列化/编码/解码整个数据数组并以这种方式通过命令行参数传递它们吗?几千兆字节的文件怎么样?
这比写入,然后从硬盘读取更快的方法吗?
编辑:这似乎是相关的: Maximum Length of Command Line String
答案 0 :(得分:1)
不是完整的答案(我无法评论任何严格的限制),但请记住,您在命令行上传递的任何数据都必须符合在内存中,并且就我而言知道在这个过程中没有办法释放这个内存......所以这不是分享千兆字节数据的实用方法。
当您使用shell=True
时,您构建的命令将由shell解释,它可能(将)对接受的参数数量以及参数的大小施加一系列限制。是。它也可能限制参数可能消耗多少内存。
陈述你的操作系统/ shell可能会很有趣,以便其他人可以参与其中 - 由于你的标签,我怀疑Windows和cmd.exe
,但无法确定!
一般来说这是一个坏主意,(虽然它不是你问题的答案),但你应该认真考虑使用管道进行进程间通信(IPC)。这将消除您的编码/解码开销,任何对大小限制的担忧,以及将数据写入磁盘的任何问题。
答案 1 :(得分:0)
main的签名是
int main(int argc, const char** argv)
因此,您受到argv大小的限制,并且无法保证能够传递超过32767个参数。根据您的操作系统和机器,您可能还有其他限制,但这是内置于该语言中的限制。
请注意,对于任何给定的编译器,可能有一个更大的int大小,并且可能能够支持更多的参数,但它不受标准的保护。