subprocess.Popen で Java System.in にデータ渡す。

subprocess.Popencommunicate に文字列をセットして実行する
Java Class の System.in に入力させてみる。

Java のクラス(実験用なので simple)

package org.talking;

import java.util.Arrays;
import java.util.Scanner;
import java.util.concurrent.atomic.AtomicInteger;

public class TalkMain {
   public static void main(String[] args) {
      AtomicInteger x = new AtomicInteger(0);
      Arrays.stream(args).map(e->"args["+x.getAndIncrement()+"] = "+e)
      .forEach(System.out::println);
      System.out.print("-->");
      try(Scanner scan = new Scanner(System.in)){
         System.out.println(scan.nextLine().toUpperCase());
      }
   }
}

java -jar で実行したいので、Maven pom.xml は、以下の plugin で
talkdemo.jar を作る。

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-shade-plugin</artifactId>
   <version>2.4.1</version>
   <executions>
      <execution>
        <phase>package</phase>
        <goals><goal>shade</goal></goals>
        <configuration>
           <finalName>talkdemo</finalName>
           <transformers>
               <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                  <mainClass>org.talking.TalkMain</mainClass>
               </transformer>
           </transformers>
           <filters>
               <filter>
                  <artifact>*:*</artifact>
                  <excludes>
                     <exclude>META-INF/*.SF</exclude>
                     <exclude>META-INF/*.DSA</exclude>
                     <exclude>META-INF/*.RSA</exclude>
                  </excludes>
               </filter>
           </filters>
        </configuration>
     </execution>
   </executions>
</plugin>

Pythonソース

# -*- coding: UTF-8 -*-
import subprocess
from subprocess import PIPE

msg = b'Hello'
p = subprocess.Popen('java -jar talkdemo.jar A B C', shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE)
(pout, perr) = p.communicate(input=msg)
print(pout.decode())

標準出力結果は、

args[0] = A
args[1] = B
args[2] = C
-->HELLO

ここで、注意しなければならないのは、
stdin を、 subprocess.PIPE することと、
communicate input= で渡す文字列引数で
バイトエンコードでなければならない。

msg = 'Hello' では、TypeError: a bytes-like object is required, not 'str'
エラーになるのである。

msg = "Hello".encode()

でも良い。