GVKun编程网logo

如何从CPython调用Java对象和函数?(cpp调用java)

27

对于如何从CPython调用Java对象和函数?感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解cpp调用java,并且为您提供关于asp.net–如何从c#调用javascript函数、j

对于如何从CPython调用Java对象和函数?感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解cpp调用java,并且为您提供关于asp.net – 如何从c#调用javascript函数、java动态检测指定路径下的批量源文件+python调用jar包获得结果、java及python调用RabbitMQ、Python PyQT:如何从辅助线程调用GUI函数?的宝贵知识。

本文目录一览:

如何从CPython调用Java对象和函数?(cpp调用java)

如何从CPython调用Java对象和函数?(cpp调用java)

我有一个在CPython实现上运行的python程序,并且在其中必须调用在Java程序中定义的函数。我怎样才能做到这一点?

能够使用一些Java对象也将是一件很棒的事。

Jython不是一个选择。我必须在CPython中运行python部分。

答案1

小编典典

最简单的事情是

  1. 为您的Java“函数”编写一个简单的CLI。(没有这样的东西,所以我假设您实际上是指Java类的方法功能。)
        public class ExposeAMethod {        public static void main( String args[] ) {             TheClassToExpose  x = new TheClassToExpose();            x.theFunction();        }    }
  1. 以此为入口编译并构建可执行的JAR文件。称它为 ExposeAMethod.jar

  2. 从子流程创建的命令中调用它。

        import subprocess    p = subprocess.Popen("java -jar ExposeAMethod.jar", shell=True)    sts = os.waitpid(p.pid, 0)

这是最低要求。而且确实不多。我数了6行Java,3行Python,您就可以运行了。

如果要将参数传递给此Java类构造函数或方法函数,则必须再编写几行代码。您有两种选择。

  • 从stdin读取参数,将结果写入stdout。这是相对容易的,并且性能非常好。

  • 将参数解析为Java的命令行选项,然后将结果写入stdout。这有点困难,但概括性很好。好处是,您现在拥有一个可以重复使用的有用的命令行Java程序。

asp.net – 如何从c#调用javascript函数

asp.net – 如何从c#调用javascript函数

我喜欢从c#调用JavaScript函数.任何人都可以给我代码片段.

更多详情…

我有一个asp.net页面,它有一个asp按钮.当我点击该按钮时,我想调用javascript函数.

喜欢……

在我的asp.net页面中,

<button id="save" onclick="i like to call a method resides in asp.net page'>Save</button>

越来越多的细节……
当点击asp.net按钮时,我喜欢执行一些服务器端操作,然后喜欢从那里调用一个javascript函数…

解决方法

对于asp:按钮,您使用 OnClientClick
<asp:Button id="myid" runat="server" OnClientClick="alert('test')" />

java动态检测指定路径下的批量源文件+python调用jar包获得结果

java动态检测指定路径下的批量源文件+python调用jar包获得结果

文章目录

  • 一、获得批量源文件
  • 二、编译批量源代码
    • 1.关键的编译函数
    • 2.完整源代码
    • 3.遇到的问题
    • 4.解决的方式
  • 三、python调用jar包
    • 1.中文乱码
    • 2.解决方法

一、获得批量源文件

完整源代码

package compile;

 
import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;
 
//操作查找文件的类
public class TextSearchFile {
    static int countFiles = 0;// 声明统计文件个数的变量
    static int countFolders = 0;// 声明统计文件夹的变量
    static String error;
 
    public static File[] searchFile(File folder, final String keyWord) {// 递归查找包含关键字的文件
 
        File[] subFolders = folder.listFiles(new FileFilter() {// 运用内部匿名类获得文件
            @Override
            public boolean accept(File pathname) {// 实现FileFilter类的accept方法
                if (pathname.isFile())// 如果是文件
                	
                    countFiles++;
                else
                	
                    // 如果是目录
                    countFolders++;
                
                if (pathname.isDirectory()
                        || (pathname.isFile() && pathname.getName().toLowerCase().contains(keyWord.toLowerCase())))// 目录或文件包含关键字
                   
                	return true;
                
                return false;
            }
        });
 
        List<File> result = new ArrayList<File>();// 声明一个集合
        for (int i = 0; i < subFolders.length; i++) {// 循环显示文件夹或文件
        	
            if (subFolders[i].isFile()) {// 如果是文件则将文件添加到结果列表中
            	
                result.add(subFolders[i]);
                
            } else {// 如果是文件夹,则递归调用本方法,然后把所有的文件加到结果列表中
                File[] foldResult = searchFile(subFolders[i], keyWord);
                
                for (int j = 0; j < foldResult.length; j++) {// 循环显示文件
                	
                    result.add(foldResult[j]);// 文件保存到集合中
                    
                }
            }
        }
 
        File files[] = new File[result.size()];// 声明文件数组,长度为集合的长度
        
        result.toArray(files);// 集合数组化
        
        return files;
    }
    
    public static String[] search_java_file() {
    	
    	System.out.print("请输入java项目路径:");
    	
    	Scanner input=new Scanner(system.in);
    	
    	String file_path=input.next();
    	
        File folder = new File(file_path);// 默认目录
        
        String keyword = ".java";
        
        if (!folder.exists()) {// 如果文件夹不存在
        	
            System.out.println("目录不存在:" + folder.getAbsolutePath());
            
            return null;
            
        }
        
        File[] result = searchFile(folder, keyword);// 调用方法获得文件数组
        
        if(result.length == 0) {
        	
        	System.out.println("在 " + folder + " 以及所有子文件时查找对象" + keyword);
        	
        	System.out.println("查找了" + countFiles + " 个文件," + countFolders + " 个文件夹,共找到 " + result.length + " 个符合条件的文件");
        
        }
        
        String src [] = new String[result.length];
        
        for (int i = 0; i < result.length; i++) {// 循环显示文件
        	
            File file = result[i];
            
            src[i] = new String(file.getAbsolutePath());//将文件绝对路径转换为字符串并保存
            
//            System.out.println(src[i]);// 显示文件绝对路径
                         		                        
        }
        
        return src;
    	
    }
 
    public static void main(String[] args) {// java程序的主入口处
    	
    
         error = CompileMain.compile(TextSearchFile.search_java_file());
        
    }
}

二、编译批量源代码

1.关键的编译函数

int result = compiler.run(null, null, error, src);
//函数参数
int run(InputStream in, OutputStream out, OutputStream err, String... arguments);

这个函数有四个参数:
第一个参数:为java编译器提供参数
第二个参数:得到java编译器的输出信息
第三个参数:接收编译器的错误信息
第四个参数:可变参数(是一个String数组)能传入一个或多个Java源文件
返回值:0扁食编译成功,非0表示编译失败
    

2.完整源代码

package compile;
//CompileMain.java
import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
 
public class CompileMain {
	
	
	public static String compile(String []src) {
		 
				JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
	       
	        	ByteArrayOutputStream error = new ByteArrayOutputStream();
	        	
	        	int result = compiler.run(null, null, error, src);
	        	
	        	System.out.println(result == 0 ? "编译成功" : "编译失败");
	        	
	        	String error_result =new String(error.toByteArray());
	        	
	        	if(!error_result.equals(null)) { 
	        		
	        		System.out.println(error_result);
	        		
	        		return error_result;
	        		
	        	}
	        		
	        		System.out.println("是否删除编译成功后的.class文件?(Y/N)");
	        		
	        		Scanner input=new Scanner(system.in);
	            	
	            	String answer=input.next();
	            	
	            	if(answer.equals("Y")||answer.equals("y")) {
	        		//编译成功,看是否删除.class文件
	            		for(int i = 0;i<src.length;i++) {
	        			
	            			String file_name = src[i].substring(0, src[i].length()-5);
	        			
	            			String class_path = file_name + ".class";
	        			
	            			File file_class = new File(class_path);
	        			
	            			file_class.delete();
	            			
	            		}
	            	}
	        		return "0错误";
	        	       	
		}
 
    public static void main(String[] args) throws IOException  {
    	
    	JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    	
    	String src [] = {"C:\\Users\\lenovo\\Desktop\\Test.java"};
    	
    	CompileMain.compile(src);
       
    }
}

3.遇到的问题

可能会出现报错如下:

Exception in thread "main" java.lang.NullPointerException

报这个错的原因是编译所需的tools.jar并不在jre中,而是在jdk安装目录下,因此需要将jre改成jdk

4.解决的方式

打开对应项目的properties,选择Java Build Path

在这里插入图片描述

点击JRE,然后点击Edit

在这里插入图片描述

点击Installed JREs ,然后点击Add,Next

在这里插入图片描述

点击Directory,选择jdk导入,然后回到前面选择之前导入的jdk就可以了

在这里插入图片描述

三、python调用jar包

1.中文乱码

之前已经尝试过调用简单的jar包进行测试了,但是这次调用的时候遇到了中文乱码的问题,后面经过测试发现是python中的print函数的问题

import locale
print(locale.getdefaultlocale())

结果:
('zh_CN', 'cp936')

2.解决方法

参考文章:https://www.cnblogs.com/reconova-56/p/12629498.html
在startJVM方法中加入参数"-Dfile.encoding=UTF8"即可

if not jpype.isJVMStarted():

   jpype.startJVM(jvmPath, "-Dfile.encoding=UTF8", "-ea", "-Djava.class.path=%s" % ext_classpath)

java及python调用RabbitMQ

java及python调用RabbitMQ

1,python调用MQ发送消息(生产者),话不多说,直接上干货

  import pika     

  如下图

2.java调用MQ发送消息(生产者)

具体代码如下:

python 的代码如下

connection = pika.BlockingConnection(pika.ConnectionParameters(''IP'',端口,''/''))
channel =connection.channel()
msg_props = pika.BasicProperties()
msg_props.content_type="text/plain"
channel.basic_publish(exchange=''EXCHANGE_ORDER_NEW'',routing_key=''QUEUE_WECHAT_ORDER'',body=''数据信息'',properties=msg_props)
connection.close()

java调用MQ的代码如下:

  ConnectionFactory factory=new ConnectionFactory();
  factory.setHost("IP地址");
  factory.setPort(1111);
  Connection connection=factory.newConnection();
  Channel channel = connection.createChannel();
  channel.queueDeclare("设置队列队列名_NEW", false, false, false, null);
  String message="要发送的消息";
  BasicProperties properties = new BasicProperties("text", null, null, null, null, null, null, null, null, null, null, null, null, null);
  channel.basicPublish("设置队列队列名_NEW", "队列名", properties, message.getBytes("UTF-8"));
  channel.close();
  connection.close();

Python PyQT:如何从辅助线程调用GUI函数?

Python PyQT:如何从辅助线程调用GUI函数?

我有一个pyqt
gui并调用了一个长进程(ffmpeg),我将其放在单独的线程上以不阻止gui。然后,当一长串命令中的一个命令完成时,我想更新进度条。问题是,我无法从辅助线程中调用gui线程中的函数。因此,我在工作线程中运行了代码,但是当我使用while循环更新进度条并读取代码值时,gui再次被阻塞。我该如何解决。我目前使用的是python线程,而不是Qthread。感谢您的帮助!

import threading, pexpectself.cmd_list = [''ffmpeg -i file outfile'',''and so on'']self.stop_proc = Falseself.executeCMD()def spawn_ffmpeg_cmd(self):    for cmd in self.cmd_list:        if self.stop_proc == False:            thread = pexpect.spawn(cmd)            print "\nstarted: %s" % cmd            cpl = thread.compile_pattern_list([pexpect.EOF,"frame= *\d+ fps=*\d+",''(.+)''])            while True:                i = thread.expect_list(cpl, timeout=None)                if i == 0: # EOF                    print "the sub process exited"                    self.pgticker += 1                    break                elif i == 1:                    frame_number_fps = thread.match.group(0)                    print frame_number_fps                    thread.close                elif i == 2:                    pass    self.startButton.setEnabled(True)def executeCMD(self):    self.startButton.setEnabled(False)    self.pgticker = 0    threading.Thread(target=self.spawn_ffmpeg_cmd, name="_proc").start()def stopprocess(self):    self.stop_proc = True    self.cmd_list = []    os.system(''pkill ffmpeg'')     self.pgticker = len(self.cmd_list)    self.startButton.setEnabled(True)def updateProgress(self):      pgfactor = 100 / len(self.cmd_list)    progress = 0.0    progress = pgfactor*int(self.pgticker)    self.progressBar.setProperty("value", progress)

答案1

小编典典

简而言之:移至QThread并使用Qt的信号和插槽,它们是线程之间进行通信的首选方式。

该答案提供了一些示例,显示如下:http://codingdict.com/questions/920
就您而言,使用上面的“ SomeObject”版本看起来像这样:

class Worker(QtCore.QObject):    madeProgress = QtCore.pyqtSignal([int])    finished = QtCore.pyqtSignal()    def __init__(self, cmdlist):        self.cmdlist = cmdlist    def run(self):        for icmd, cmd in enumerate(self.cmdlist):            # execute your work            # processCommand(cmd)            # signal that we''ve made progress            self.madeProgress.emit(icmd)        # emit the finished signal - we''re done        self.finished.emit()

然后将此工作程序移动到QThread您创建的实例。按照链接的答案中的模式,然后可以将madeProgress信号连接到setValue进度条的插槽:

workerThread = QThread()workerObject = Worker(cmdlist)workerObject.moveToThread(workerThread)workerThread.started.connect(workerObject.run)workerObject.finished.connect(workerThread.quit)# create a progressbar with min/max according to# the length of your cmdlistprogressBar = QProgressBar()progressBar.setRange(0, len(cmdlist))# connect the worker''s progress signal with the progressbarworkerObject.madeProgress.connect(progressBar.setValue)# start the thread (starting your worker at the same time)workerThread.start()

关于如何从CPython调用Java对象和函数?cpp调用java的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于asp.net – 如何从c#调用javascript函数、java动态检测指定路径下的批量源文件+python调用jar包获得结果、java及python调用RabbitMQ、Python PyQT:如何从辅助线程调用GUI函数?的相关知识,请在本站寻找。

本文标签: