对于如何从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)
- asp.net – 如何从c#调用javascript函数
- java动态检测指定路径下的批量源文件+python调用jar包获得结果
- java及python调用RabbitMQ
- Python PyQT:如何从辅助线程调用GUI函数?
如何从CPython调用Java对象和函数?(cpp调用java)
我有一个在CPython实现上运行的python程序,并且在其中必须调用在Java程序中定义的函数。我怎样才能做到这一点?
能够使用一些Java对象也将是一件很棒的事。
Jython不是一个选择。我必须在CPython中运行python部分。
答案1
小编典典最简单的事情是
- 为您的Java“函数”编写一个简单的CLI。(没有这样的东西,所以我假设您实际上是指Java类的方法功能。)
public class ExposeAMethod { public static void main( String args[] ) { TheClassToExpose x = new TheClassToExpose(); x.theFunction(); } }
以此为入口编译并构建可执行的JAR文件。称它为
ExposeAMethod.jar
从子流程创建的命令中调用它。
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页面,它有一个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:Button id="myid" runat="server" OnClientClick="alert('test')" />
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
三、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
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函数?
我有一个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函数?的相关知识,请在本站寻找。
本文标签: