subprocess.Popen の communicate に文字列をセットして実行する
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()
でも良い。