首页 > 解决方案 > 将 python 子进程转换为 Java 进程

问题描述

我需要通过 Java 执行 shell 命令,但是我的 Java 代码有问题。

实际上,我可以通过 java 运行 cmd。

整个命令行是“solc-0.4.25 --bin /Users/programmerc/Documents/Research_Data/Smart_Contract_Source_Code/SourceCode/0xb7b80925d8e86b787ff21f96112c588aa6bb32a9.sol | solc-0.4.25 --link --libraries /Users/programmerc/Documents/Researc :0x00000000000000000000000000000000000000001"

我的python代码很正常。代码是:

option = "--libraries /Users/programmerc/Documents/Researc:0x0000000000000000000000000000000000000001"
FNULL = open(os.devnull, 'w')
cmd = "solc-0.4.25 --bin-runtime %s" % filename
p1 = subprocess.Popen(shlex.split(cmd), stdout=subprocess.PIPE, stderr=FNULL)
cmd = "solc-0.4.25 --link%s" %option
p2 = subprocess.Popen(shlex.split(cmd), stdin=p1.stdout, stdout=subprocess.PIPE, stderr=FNULL)
p1.stdout.close()
out = p2.communicate()[0].decode()

但是,我的 Java 代码有问题。我的Java代码是:

    public static String runCMDWithTimeout(String cmd[]){

        final ExecutorService exec = Executors.newFixedThreadPool(1);
        String result = null;
        Callable<String> call = new Callable<String>() {
            public String call() throws Exception {
                String result = "";
                Process pro = Runtime.getRuntime().exec(cmd);

                InputStream in = null;
                in = pro.getInputStream();

                BufferedReader reader = new BufferedReader(new InputStreamReader(in));
                String line = "";
                while((line = reader.readLine()) != null)
                    result += line + "\n";
                pro.destroy();
                return result;
            }
        };

        try {

            Future<String> future = exec.submit(call);
            result = future.get(1000 * 10, TimeUnit.MILLISECONDS);

        } catch (TimeoutException e){
            System.out.println(cmd[cmd.length-1] + " ===> time out");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            exec.shutdown();
        }

        return result;
    }

    String str = "solc-0.4.25 --bin /Users/programmerc/Documents/Research_Data/Smart_Contract_Source_Code/SourceCode/0xb7b80925d8e86b787ff21f96112c588aa6bb32a9.sol | solc-0.4.25 --link --libraries /Users/programmerc/Documents/Researc:0x0000000000000000000000000000000000000001";
  
    String output = Utils.runCMDWithTimeout(str.splite(" "));

我已经尝试了代码,但我什么也没返回。

标签: javapythonsubprocess

解决方案


推荐阅读