| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 34 人关注过本帖
标题:提问 DeepSeek:在 VFP 中调用 Python
只看楼主 加入收藏
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:559
专家分:380
注 册:2013-10-4
结帖率:100%
收藏
 问题点数:0 回复次数:2 
提问 DeepSeek:在 VFP 中调用 Python
在VFP中调用Python

在 VFP 中调用 Python 有多种方式,以下是完整的实现方案(感觉似乎挺无聊的一个问题):

方法1:使用 RUN 命令(最简单)
foxpro
* 基础调用
RUN python script.py

* 带参数调用
RUN python script.py arg1 arg2

* 指定完整路径
RUN C:\Python39\python.exe script.py

* 隐藏命令行窗口
RUN /N python script.py
方法2:使用 WScript.Shell(推荐)
foxpro
* 创建 Shell 对象
oShell = CREATEOBJECT("WScript.Shell")

* 同步执行(等待完成)
nResult = oShell.Run("python script.py", 1, .T.)
? "执行结果:", nResult

* 异步执行(不等待)
oShell.Run("python script.py", 0, .F.)

* 带参数和环境变量
lcCommand = "python script.py " + '"参数1" "参数2"'
nResult = oShell.Run(lcCommand, 1, .T.)
方法3:完整的 Python 调用框架
foxpro
* 完整的 Python 调用函数
FUNCTION RunPython(tcScript, tcParams, tcPythonPath)
LOCAL oShell, lcCommand, lnResult, lcPythonExe

* 确定 Python 路径
IF EMPTY(tcPythonPath)
    * 尝试自动查找 Python
    lcPythonExe = FindPython()
    IF EMPTY(lcPythonExe)
        MESSAGEBOX("未找到 Python 解释器")
        RETURN -1
    ENDIF
ELSE
    lcPythonExe = tcPythonPath
ENDIF

* 构建命令
lcCommand = lcPythonExe + " " + tcScript
IF !EMPTY(tcParams)
    lcCommand = lcCommand + " " + tcParams
ENDIF

* 执行命令
oShell = CREATEOBJECT("WScript.Shell")
lnResult = oShell.Run(lcCommand, 1, .T.)

RETURN lnResult
ENDFUNC

* 查找 Python 解释器
FUNCTION FindPython()
LOCAL aPaths[10], i, lcPath

* 常见的 Python 安装路径
DIMENSION aPaths[10]
aPaths[1] = "python"
aPaths[2] = "python3"
aPaths[3] = "py"
aPaths[4] = "C:\Python39\python.exe"
aPaths[5] = "C:\Python310\python.exe"
aPaths[6] = "C:\Python311\python.exe"
aPaths[7] = "C:\Program Files\Python39\python.exe"
aPaths[8] = "C:\Program Files\Python310\python.exe"
aPaths[9] = "C:\Users\" + SYS(0) + "\AppData\Local\Programs\Python\Python39\python.exe"
aPaths[10] = "C:\Users\" + SYS(0) + "\AppData\Local\Programs\Python\Python310\python.exe"

FOR i = 1 TO ALEN(aPaths)
    IF FILE(aPaths[i]) OR CheckCommand(aPaths[i])
        RETURN aPaths[i]
    ENDIF
ENDFOR

RETURN ""
ENDFUNC

* 检查命令是否存在
FUNCTION CheckCommand(tcCommand)
LOCAL oShell, lnResult

TRY
    oShell = CREATEOBJECT("WScript.Shell")
    lnResult = oShell.Run("cmd /c " + tcCommand + " --version >nul 2>&1", 0, .T.)
    RETURN (lnResult = 0)
CATCH
    RETURN .F.
ENDTRY
ENDFUNC
方法4:使用管道获取 Python 输出
foxpro
* 获取 Python 脚本的输出
FUNCTION GetPythonOutput(tcScript, tcParams)
LOCAL oShell, oExec, lcOutput, lcCommand, lcPythonExe

lcPythonExe = FindPython()
IF EMPTY(lcPythonExe)
    RETURN "Python not found"
ENDIF

lcCommand = lcPythonExe + " " + tcScript
IF !EMPTY(tcParams)
    lcCommand = lcCommand + " " + tcParams
ENDIF

oShell = CREATEOBJECT("WScript.Shell")
oExec = oShell.Exec(lcCommand)

* 读取输出
lcOutput = ""
DO WHILE !oExec.StdOut.AtEndOfStream
    lcOutput = lcOutput + oExec.StdOut.ReadLine() + CHR(13)
ENDDO

* 读取错误信息(如果有)
IF !oExec.StdErr.AtEndOfStream
    lcErrors = ""
    DO WHILE !oExec.StdErr.AtEndOfStream
        lcErrors = lcErrors + oExec.StdErr.ReadLine() + CHR(13)
    ENDDO
    IF !EMPTY(lcErrors)
        lcOutput = lcOutput + "错误信息:" + CHR(13) + lcErrors
    ENDIF
ENDIF

RETURN lcOutput
ENDFUNC
方法5:Python COM 服务器
Python 端代码(server.py)
python
import pythoncom
import win32com.server.register

class VFP_Python_Server:
    _public_methods_ = ['add', 'subtract', 'process_data', 'html_to_text']
    _reg_progid_ = "VFP.PythonServer.1"
    _reg_clsid_ = pythoncom.CreateGuid()
   
    def add(self, a, b):
        return a + b
   
    def subtract(self, a, b):
        return a - b
   
    def process_data(self, data):
        # 处理数据示例
        return data.upper()
   
    def html_to_text(self, html_content):
        # HTML 转纯文本
        from html import unescape
        import re
        text = re.sub(r'<[^>]+>', ' ', html_content)
        text = unescape(text)
        text = re.sub(r'\s+', ' ', text)
        return text.strip()

if __name__ == '__main__':
    win32com.server.register.UseCommandLine(VFP_Python_Server)
VFP 端调用
foxpro
* 注册 Python COM 服务器
RUN python server.py --register

* VFP 中调用
oPython = CREATEOBJECT("VFP.PythonServer.1")

? "加法测试:", oPython.add(10, 5)          && 返回 15
? "减法测试:", oPython.subtract(10, 5)     && 返回 5

lcHtml = "<p>测试<b>HTML</b>内容</p>"
lcText = oPython.html_to_text(lcHtml)
? "HTML转文本:", lcText                    && 返回 "测试 HTML 内容"
方法6:使用临时文件通信
Python 脚本(process.py)
python
import sys
import json
import os

def process_data(input_data):
    # 你的处理逻辑
    return {"result": input_data.upper(), "status": "success"}

if __name__ == "__main__":
    # 从命令行参数或文件读取输入
    if len(sys.argv) > 1:
        input_file = sys.argv[1]
        output_file = sys.argv[2] if len(sys.argv) > 2 else "output.json"
        
        with open(input_file, 'r', encoding='utf-8') as f:
            data = f.read()
        
        result = process_data(data)
        
        with open(output_file, 'w', encoding='utf-8') as f:
            json.dump(result, f, ensure_ascii=False)
        
        print(output_file)  # 返回输出文件路径
VFP 端调用
foxpro
FUNCTION CallPythonWithFiles(tcInputData)
LOCAL lcInputFile, lcOutputFile, lcResult, lcPythonOutput

* 创建临时文件
lcInputFile = SYS(2023) + "\input_" + SYS(2015) + ".txt"
lcOutputFile = SYS(2023) + "\output_" + SYS(2015) + ".json"

* 写入输入数据
STRTOFILE(tcInputData, lcInputFile)

* 调用 Python
lcCommand = "python process.py " + lcInputFile + " " + lcOutputFile
lcPythonOutput = GetPythonOutput("process.py", lcInputFile + " " + lcOutputFile)

* 读取结果
IF FILE(lcOutputFile)
    lcResult = FILETOSTR(lcOutputFile)
    ? "Python 处理结果:", lcResult
ENDIF

* 清理临时文件
DELETE FILE (lcInputFile)
DELETE FILE (lcOutputFile)

RETURN lcResult
ENDFUNC
方法7:实际应用示例
foxpro
* 示例1:使用 Python 处理大数据
PROCEDURE ProcessLargeFileWithPython
LOCAL lcPythonScript, lcResult

lcPythonScript = "process_large_file.py"

? "开始使用 Python 处理大文件..."

* 调用 Python 脚本
lcResult = GetPythonOutput(lcPythonScript, "input.html output.txt")

IF !EMPTY(lcResult)
    ? "处理完成!"
    ? "输出:", lcResult
ELSE
    ? "处理失败"
ENDIF
ENDPROC

* 示例2:调用 Python 进行数据分析
PROCEDURE DataAnalysisWithPython
LOCAL oShell, lcCommand, lnResult

lcCommand = "python data_analysis.py "
lcCommand = lcCommand + "--input data.csv "
lcCommand = lcCommand + "--output report.txt "
lcCommand = lcCommand + "--format json"

oShell = CREATEOBJECT("WScript.Shell")
lnResult = oShell.Run(lcCommand, 1, .T.)

IF lnResult = 0
    ? "数据分析完成"
ELSE
    ? "分析失败,错误码:", lnResult
ENDIF
ENDPROC
推荐方案
根据需求推荐:

简单调用 → 方法1(RUN 命令)

需要获取输出 → 方法4(管道获取)

高性能通信 → 方法5(COM 服务器)

处理大文件 → 方法6(文件通信)

生产环境 → 方法2(WScript.Shell)

使用示例
foxpro
* 最简单的调用方式
RUN python myscript.py

* 获取 Python 输出
lcResult = GetPythonOutput("myscript.py", "参数1 参数2")
? "Python 返回:", lcResult

* 处理 HTML 文件
lcHtml = FILETOSTR("large_file.html")
lcText = CallPythonWithFiles(lcHtml)
STRTOFILE(lcText, "output.txt")

这样就可以在 VFP 中灵活调用 Python 了!

在VFP中调用Python.rar (2.98 KB)


搜索更多相关主题的帖子: RETURN RUN IF 调用 Python 
昨晚 22:52
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:559
专家分:380
注 册:2013-10-4
收藏
得分:0 
在 VFP 中调用 .Net (前提是:你懂.Net,玩得转.Net !)

在VFP中调用.Net的C#代码库.rar (5.12 KB)


昨晚 23:18
schtg
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:Usa
等 级:贵宾
威 望:67
帖 子:2367
专家分:4881
注 册:2012-2-29
收藏
得分:0 
谢谢分享!
3 小时前
快速回复:提问 DeepSeek:在 VFP 中调用 Python
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021495 second(s), 9 queries.
Copyright©2004-2025, BC-CN.NET, All Rights Reserved