我正在通过 JSch 从本地 Java 代码调用远程 Python 脚本。 当我在 Python 盒子上从 Java 执行“ls”时,它返回正确的结果(连接有效)。然后我编写了一个小程序,返回字符串“hello world”。在 Java 方面,结果显示为空白。一般来说,如果终端有输出,就会返回,但不会返回变量。
Java代码:
import com.jcraft.jsch.*;
import java.io.IOException;
import java.io.InputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
public class SSHManager
{
private static final Logger LOGGER = Logger.getLogger(SSHManager.class.getName());
private JSch jschSSHChannel;
private String strUserName;
private String strConnectionIP;
private int intConnectionPort;
private String strPassword;
private Session sesConnection;
private int intTimeOut;
private void doCommonConstructorActions(String userName, String password,
String connectionIP, String knownHostsFileName)
{
jschSSHChannel = new JSch();
try
{
jschSSHChannel.setKnownHosts(knownHostsFileName);
}
catch(JSchException jschX)
{
logError(jschX.getMessage());
}
strUserName = userName;
strPassword = password;
strConnectionIP = connectionIP;
}
public SSHManager(String userName, String password,
String connectionIP, String knownHostsFileName)
{
doCommonConstructorActions(userName, password,
connectionIP, knownHostsFileName);
intConnectionPort = 22;
intTimeOut = 60000;
}
public SSHManager(String userName, String password, String connectionIP,
String knownHostsFileName, int connectionPort)
{
doCommonConstructorActions(userName, password, connectionIP,
knownHostsFileName);
intConnectionPort = connectionPort;
intTimeOut = 60000;
}
public SSHManager(String userName, String password, String connectionIP,
String knownHostsFileName, int connectionPort, int timeOutMilliseconds)
{
doCommonConstructorActions(userName, password, connectionIP,
knownHostsFileName);
intConnectionPort = connectionPort;
intTimeOut = timeOutMilliseconds;
}
public String connect()
{
String errorMessage = null;
try
{
sesConnection = jschSSHChannel.getSession(strUserName,
strConnectionIP, intConnectionPort);
sesConnection.setPassword(strPassword);
// UNCOMMENT THIS FOR TESTING PURPOSES, BUT DO NOT USE IN PRODUCTION
// sesConnection.setConfig("StrictHostKeyChecking", "no");
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
sesConnection.setConfig(config);
sesConnection.connect(intTimeOut);
}
catch(JSchException jschX)
{
System.out.println("Connection failed.");
errorMessage = jschX.getMessage();
}
return errorMessage;
}
private String logError(String errorMessage)
{
if(errorMessage != null)
{
LOGGER.log(Level.SEVERE, "{0}:{1} - {2}",
new Object[]{strConnectionIP, intConnectionPort, errorMessage});
}
return errorMessage;
}
private String logWarning(String warnMessage)
{
if(warnMessage != null)
{
LOGGER.log(Level.WARNING, "{0}:{1} - {2}",
new Object[]{strConnectionIP, intConnectionPort, warnMessage});
}
return warnMessage;
}
public String sendCommand(String command)
{
StringBuilder outputBuffer = new StringBuilder();
try
{
Channel channel = sesConnection.openChannel("exec");
((ChannelExec)channel).setCommand(command);
channel.connect();
InputStream commandOutput = channel.getInputStream();
int readByte = commandOutput.read();
while(readByte != 0xffffffff)
{
outputBuffer.append((char)readByte);
readByte = commandOutput.read();
}
channel.disconnect();
}
catch(IOException ioX)
{
logWarning(ioX.getMessage());
return null;
}
catch(JSchException jschX)
{
logWarning(jschX.getMessage());
return null;
}
return outputBuffer.toString();
}
public void close()
{
sesConnection.disconnect();
}
}
测试代码:
import static org.junit.Assert.*;
import org.junit.Test;
public class SSHManagerTest {
/**
* Test of sendCommand method, of class SSHManager.
*/
@Test
public void testSendCommand()
{
System.out.println("sendCommand");
String command = "python /home/abc/helloworld.py";
String userName = "abc";
String password = "pqr";
String connectionIP = "10.112.1.2";
SSHManager instance = new SSHManager(userName, password, connectionIP, "");
String errorMessage = instance.connect();
if(errorMessage != null)
{
System.out.println(errorMessage);
fail();
}
//String expResult = "thisOne\n";
// call sendCommand for each command and the output
//(without prompts) is returned
String result = instance.sendCommand(command);
System.out.println(result + " (expected hello world)");
// close only after all commands are sent
instance.close();
assertEquals(expResult, result);
}
}
Python 代码:
#!/usr/bin/python
def main():
return "Hello world"
最佳答案
脚本
#!/usr/bin/python
def main():
return "Hello world"
不会向 stdout 产生任何输出,即 return
只是返回一个值,不会将其打印在 stdout 上。您可以尝试这样做:
#!/usr/bin/env python
def main():
print("Hello world")
请注意,我还更改了“shebang”以使用env
。这通常是调用 python 的更可靠的方法,因为它避免了路径问题。
关于java - 从远程 Python 脚本返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26777784/