IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 所有编程语言调用python方式,非命令行可以获取返回值,适合所有Python版本 -> 正文阅读

[Python知识库]所有编程语言调用python方式,非命令行可以获取返回值,适合所有Python版本

目前为止,如java,go等编程语言调用python的主要方式是命令行调用或者利用python c api,jpython等方式进行调用,这些方式各有各自的缺陷,比如jpython只能试用特定python,命令行无法获得返回值等,为此我想到一个方法,及python调用python,暴露一个api,可以适合各种编程语言,切对于Python所以import都适用,直接先上代码了

from flask import request, jsonify, Flask
import importlib
import inspect
import sys
import json

app = Flask(__name__)


@app.route('/', methods=["POST"])
def run_py():  # put application's code here
    data_list = []
    data = json.loads(request.get_data(as_text=True))

    method = data["method"]
    path = data["path"]
    type = data["type"]
    args = data["args"]
    sys_path = data["sys"]
    for p in sys_path:
        sys.path.append(p)

   #moudle_name无实际作用
    spec = importlib.util.spec_from_file_location("moudle_name", path)
    odm = importlib.util.module_from_spec(spec)
    spec.loader.exec_module(odm)
    v_list = []
    if hasattr(odm, method):
        func = getattr(odm, method)
        v_list = []
        r = inspect.getfullargspec(func)  # 获取FullArgSpec对象
        j = 0
        for i in r.args:
            if type == "map":
                v_list.append(args[i])
            elif type == "array":
                v_list.append(args[j])
                j = j + 1
        res = func(*v_list)
        return jsonify({"code": 200, "msg": "ok", "data": res})


if __name__ == '__main__':
    app.run(host="127.0.0.1",port=5000)


该段代码有5个参数

  • method:方法名字
  • path:py文件路径
  • args:python方法参数
  • type:参数类型,支持map和array
  • sys:依赖库地址,在Python使用虚拟环境时可以使用

接下来使用python写个简单demoo


import requests
import json

def add(a,b):
	a = 1
	b = 2
	return a+b,a,b

def test():
	url = "https://www.baidu.com"

	response = requests.request("GET", url)
	data=json.dumps({"test":"该方法只是为了测试有依赖情况下是否可以使用"})
	return data

该py文件地址在/home/lihang/PycharmProjects/test/test.py

我们先使用postman测试一下
在这里插入图片描述
在这里插入图片描述
很明显成功了,接着使用各种编程语言尝试

Java

OkHttpClient client = new OkHttpClient().newBuilder()
  .build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\n    \"method\":\"test\",\n    \"type\":\"map\",\n    \"path\":\"/home/lihang/PycharmProjects/test/test.py\",\n    \"args\":{\n    },\n    \"sys\":[]\n}");
Request request = new Request.Builder()
  .url("http://127.0.0.1:5000/")
  .method("POST", body)
  .addHeader("Content-Type", "application/json")
  .build();
Response response = client.newCall(request).execute();

Go

package main

import (
  "fmt"
  "strings"
  "net/http"
  "io/ioutil"
)

func main() {

  url := "http://127.0.0.1:5000/"
  method := "POST"

  payload := strings.NewReader(`{
    "method":"test",
    "type":"map",
    "path":"/home/lihang/PycharmProjects/test/test.py",
    "args":{
    },
    "sys":[]
}`)

  client := &http.Client {
  }
  req, err := http.NewRequest(method, url, payload)

  if err != nil {
    fmt.Println(err)
    return
  }
  req.Header.Add("Content-Type", "application/json")

  res, err := client.Do(req)
  if err != nil {
    fmt.Println(err)
    return
  }
  defer res.Body.Close()

  body, err := ioutil.ReadAll(res.Body)
  if err != nil {
    fmt.Println(err)
    return
  }
  fmt.Println(string(body))
}

bash

curl --location --request POST 'http://127.0.0.1:5000/' \
--header 'Content-Type: application/json' \
--data-raw '{
    "method":"test",
    "type":"map",
    "path":"/home/lihang/PycharmProjects/test/test.py",
    "args":{
    },
    "sys":[]
}'

Ruby

require "uri"
require "json"
require "net/http"

url = URI("http://127.0.0.1:5000/")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Post.new(url)
request["Content-Type"] = "application/json"
request.body = JSON.dump({
  "method": "test",
  "type": "map",
  "path": "/home/lihang/PycharmProjects/test/test.py",
  "args": {},
  "sys": []
})

response = http.request(request)
puts response.read_body

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-04-06 16:14:01  更:2022-04-06 16:15:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 17:20:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码