【问题标题】:Universal (or best) option to call Python from other languages?从其他语言调用 Python 的通用(或最佳)选项?
【发布时间】:2016-03-19 14:48:05
【问题描述】:

我在 Python 中创建了一个库。我可以在 Linux 或 Windows 上使用它。我也希望能够从大多数非 Python 脚本/程序中调用它。理想情况下,如果可能的话,我想要一个跨平台选项,但 Linux 是目前最重要的。除了通过命令提示符界面和进行系统调用/ShellExec 样式使用脚本之外,还有其他方法可以实现吗?例如,如果这都是基于 Windows 的编程,我可以创建一个 dll ......不过,如果我能以某种方式从 Linux 中的 php 和 Windows 中的 C++ 等以某种方式直接使用该库,那就太棒了。有什么想法吗?

【问题讨论】:

    标签: python shared-libraries cross-platform


    【解决方案1】:

    既然您说您不想使用命令行界面,那么跨平台访问服务的逻辑答案是使用 Web API。而且,通过这样做,API 的使用者可以在与提供者不同的操作系统上运行。

    在关注blog post 之前,我已经设置了 API。有一个更完整的 Python 选项列表here

    【讨论】:

    • 我认为总的来说这是一个很好的解决方案,并为你投票。它避免了命令行界面,避免了子进程,并且是跨平台的!我没有包括我的直接用例的详细信息,但基本上我正在开发的这个特定库涉及一系列私有服务器到服务器的安全 https 帖子(和其他 Web 协议)。我想要一个客户端,它提供一个库服务,将其与帖子、ssl 证书、http 代码等隔离开来。所以,这个解决方案对于这个目的来说有点多余和愚蠢。 (不是你的错,我没有预先包含所有这些细节!)
    • 嗯,我想到了docs.python.org/2/extending/embedding.html,但你说“从大多数...脚本/程序中调用它”。嵌入式 python 仅在您也编写客户端时才有效。另一种选择是拥有一个您监视的目录,让客户端将请求放入其中,然后查找响应文件。仅适用于 unix,有命名管道。
    • 另一个好建议。我认为如果我只想在 Windows 中实现这一点,我可能会将 Python 嵌入到 C++ dll 中。我相信 dll 可以与所有其他 MS 技术兼容,例如C#、VB 等。不过,这对 Linux 没有帮助,除非有 Linux 等效的 dll?
    • 使用文件系统作为中间人将是另一种选择 - 或数据库。我几乎使用过你和@armatita 曾经建议过的这些方法。当然,没有一个像直接使用库/dll那样“干净”。
    【解决方案2】:

    拨打电话是一个宽泛的描述,解决方案取决于您是否希望从这些电话中提供和接收输出。如果你这样做了,你可以使用 JSON 在 PHP 和 Python 之间遵循一个非常通用的解决方案。对于 php: 注意:不是我的代码,请参阅原始 here

        // This is the data you want to pass to Python
        $data = array('as', 'df', 'gh');
    
        // Execute the python script with the JSON data
        $result = shell_exec('python /path/to/myScript.py ' . escapeshellarg(json_encode($data)));
    
        // Decode the result
        $resultData = json_decode($result, true);
    
        // This will contain: array('status' => 'Yes!')
        var_dump($resultData);
    

    对于 Python:

        import sys, json
    
        # Load the data that PHP sent us
        try:
            data = json.loads(sys.argv[1])
        except:
            print "ERROR"
            sys.exit(1)
    
        # Generate some data to send to PHP
        result = {'status': 'Yes!'}
    
        # Send it to stdout (to PHP)
        print json.dumps(result)
    

    显然,如果您不需要这个,在 PHP 中使用 systempopen 可能就足够了。还要检查:

    Question 1 Question 2

    【讨论】:

    • 谢谢。我确实想双向传递数据。您的答案的问题在于它实际上确实使用了系统调用/ shellex,这是我想到的直接解决方案,但我一直在寻找替代方案。不过,有趣的是,您的一个链接包含指向 csh.rit.edu/~jon/projects/pip 的链接,至少对于 python/php 来说这是一个有趣的可能性(尽管不是“通用”解决方案)。
    • 它必须在某个时候发生,除非您有某种方式将 Python 语法转换为 php,或者在您发布的链接中以某种方式使扩展打开 Python 解释器(我猜,一旦你想开始将库加载到你的 python 库中,这将是一种新型的噩梦)。无论如何,链接似乎已更新并且项目处于活动状态。您为什么不直接联系制作它的人并询问它是否适用于您正在尝试做的事情?
    • 我可以这样做。谢谢。而且,是的,我确实想使用其他 Python 库。这就是它的核心。 Python 可以让你用很少的代码执行很多强大的任务,我想将这种能力“传播”到其他客户端语言——最好是通过一个简单的通用接口。
    • 我认为(但问那个人)该工具比仅使用外部进程更糟糕。请记住,您可以使用控制台参数(隐藏子进程的内容)为调用 Python 中的函数创建一个干净的 api。如果做得好,用户永远不会知道它被称为外部进程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    • 2021-09-07
    相关资源
    最近更新 更多