質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2676閲覧

pythonでjarファイルを開いた後に値を入力する方法

pardeki

総合スコア9

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2021/06/09 01:48

編集2021/06/09 02:55

前提・実現したいこと

公開されているデータ解析用jarファイルを使って、自分の持ってるデータの解析を行いたいと考えています。
そのjarファイルを開くと値の入力を何回か求められるので、それを入力すれば解析できるという寸法です。
自身がpythonしか使用経験がないため、pythonで解析をしたいと考えています。

発生している問題・エラーメッセージ

python上で、jarファイルを開くことは成功しています。
すると解析用途に応じて、1,2,3のいずれかの値を入力するようにソフトが聞いてきます。
自分は1を入力したいのですが、それができません。

該当のソースコード

python

1import subprocess 2import pyautogui 3 4subprocess.call(['Java', '-jar', '解析ソフト.jar']) #ソフトを開く 5pyautogui.typewrite('1') #1を入力する

試したこと

上記のコードを試しましたが、ソフトはターミナル内で起動するものの値の入力はできませんでした。
値の入力ができないというより、5行目以下のコードが走ってないというのが正しいかもしれません。
4行目のコードを無効化させると、"1"の入力ができることも確認しています。

補足情報(FW/ツールのバージョンなど)

Visual studio codeというソフトでコードを書き、その中のターミナルでコードを実行しています。
実行環境はwindowsです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2021/06/09 01:54

ブラウザはともかくデスクトップアプリの自動操作は外部からは難しいのでは。
m.ts10806

2021/06/09 01:55

>4行目のコードを無効化させると、"1"の入力ができることも確認しています。 これは自前で起動しておいたということ?
dodox86

2021/06/09 02:04 編集

実行の環境はWindows、あるいはLinux(UN*X)でしょうか。詳細を質問文中に提示してください。 また、「java -jar 解析ソフト.jar」をコマンドラインで実行する時、"1"の入力を標準入力から行うことはできるでしょうか。例えば以下のようなコマンド入力で実行できるか、ということです。 $ echo "1" | java -jar 解析ソフト.jar
pardeki

2021/06/09 02:11

>>m.ts10806さん 誤解させてしまいました。 単純にターミナル内に1を入力できることは確認できたということです。 >>dodox86さん 実行環境はwindowsです、その旨追記しました。 2番目の質問についてなのですが、コマンド入力の意味がわからない程の初心者なのですが 4行目のコードで起動→ターミナル部分をクリック→自身で"1"をキーボードで入力 これに関しては上手くworkします。
dodox86

2021/06/09 02:19 編集

[2021/06/09 11:07]の質問編集を読んで: その解析ソフトと言うのは、実行すると何かウィンドウが出てきてそこで入力するということなのでしょうか。 そうではなく、CUIのコンソールベースのプログラムで、コマンドプロンプト上で逐一、入力していくのでしょうか。例えばそのプログラム内で"quit"のようなコマンド入力をするとそのプログラムは終わるとか。 「コマンドプロンプト」や「PowerShell」は分かりますでしょうか。Visual Studio Codeのターミナルでどのような画面(文字列)が出ていますか。
pardeki

2021/06/09 02:21

コマンドプロンプト上で逐一入力するタイプです。 別のウィンドウ等は出てきません。 ファイルを実行すると解析ソフトが起動し、入力待機状態(1,2,3のどれかを入力しろ状態)になります
dodox86

2021/06/09 02:34

ちょっと話は戻りますが、質問文中、subprocess.call()で指定している 'Java'は、'java'の間違いではありませんか。(javaコマンドなので)それを直すとOKだったりしませんか。
dodox86

2021/06/09 02:36

あ、いや、Windowsのコマンドプロンプトなので、大文字小文字は区別しないか。’Java'でも実行はできますね。
pardeki

2021/06/09 02:42

念のため実行してみましたが、結果は変わらずでした。 もう一方の仰ることを実行してみたところ、コードの実行→ソフトの起動を同一ターミナル内で起きているので ソフト起動の時点で、起動以下のコードが走っていないのが原因のようです。 何か解決策はあるでしょうか…
dodox86

2021/06/09 02:44

えーとですね、要はその「解析ソフト.jar」のJavaプログラムが、標準入力で"1"と言うデータ指定を受け付け、解析結果が標準出力に出力されて終了するプログラムなのであれば、pythonのsubprocessで「標準入力」「標準出力」を繋ぎ変えた後に実行すればpyautoguiを使わず、Pythonスクリプトから操作できる、はずなのです。それを見極めるための本コメント欄でのヒアリングなのです。 https://docs.python.org/ja/3/library/subprocess.html
m.ts10806

2021/06/09 02:50

タイトル変になってませんか
dodox86

2021/06/09 02:55

しかし、もし「1,2,3」の3つしか選択肢が無いなどであれば、手動の操作が必要なくなるような、コマンドラインから指定するオプションがもともと用意されていたりして。
pardeki

2021/06/09 02:58

>>m.ts10806さん タイトル修正しました。 >>dodox86さん 誤解させてしまっているかもしれません。 まず最初に解析モードを1,2,3の中から選び、その後の入力部分に自分のデータを入れるプロセスになっています。 この自分のデータが大量にあるので、pythonを使って自動化したいという動機です。
dodox86

2021/06/09 03:13

int32_tさんよりいただいた回答のようなことを言っていました。解決されたのであればOKです。
pardeki

2021/06/09 03:15

こちらこそ、親切にありがとうございました! 丁寧に教えていただいたので、専門用語の勉強にもなりました!
dodox86

2021/06/09 03:18

一部のプログラムでは標準入出力を使わずに画面に入出力するものもある(<まぁ、JavaのCUIではまず無いでしょうけれども)ので、その見極めの為のヒアリングでした。
guest

回答2

0

ベストアンサー

この用途には、subprocess.call()は利用できません。

https://docs.python.org/ja/3/library/subprocess.html#subprocess.call

args で指定されたコマンドを実行します。コマンドの終了を待ち、returncode 属性を返します。

標準入力からデータを受け取る子プロセスであれば、Popenで可能かと思います。

投稿2021/06/09 02:52

int32_t

総合スコア21695

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pardeki

2021/06/09 03:05

おおお、すごい! できました。 import subprocess import pyautogui import time subprocess.Popen(['java', '-jar', '解析ソフト.jar']) #ソフト起動 pyautogui.click (1400,800) #CSV内のターミナルをクリック time.sleep(0.5) #時間を置く pyautogui.typewrite('1') #"1"を入力 以上のコードでいけました。 ありがとうございます!!
guest

0

Pythonは分からないので状況からしての一案として。

call()ではコマンドを実行しただけで、実行した先の処理がどうなってるとかは関係なく、コマンド自体が成功したかどうかしか取らないと思います。
(訂正。フォーム実行ではなくAPIとしてデータが返るならそれは受け取るだろうけど)

そのjarでアプリケーションが立ち上がるようになってるとしても、起動終了までは待ってないのではということですね。
アプリケーションが起動してないから送信しても受け付ける先がないと解釈できます。
実行されてるかどうかはデバッグで見えますのでご自身でご確認を。

でしたらcallしてすぐ入力するのではなく、数秒sleepさせてみてはどうでしょう。
幸いsleep関数というのがあるようですし。

投稿2021/06/09 02:02

編集2021/06/09 02:04
m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pardeki

2021/06/09 02:16

ご回答ありがとうございます。 sleepで時間を置いても反応がないです。 印象としては入力が早すぎるというより call()で実行してしまうとそれ以下のコードが走ってない感じがします。 同じターミナル内でコードの実行とjarファイルの実行が行われているために call()をしてしまうと、jarファイルの実行が優先されてしまうためでしょうか。 もし解決法がありましたら(できるかわかりませんが、二窓で実行すれば解決??とか) ご教示いただけますと助かります。
m.ts10806

2021/06/09 02:21

走ってるかどうかはデバッグで確認できます。「感じがする」ではなく確実に確認してください。 確かにjar起動でカレント奪われる可能性も考えられますが、そもそもプログラムからの自動入力自体が不可能では?という懸念は消えてません。
pardeki

2021/06/09 02:26

デバッグの仕方として正しいかがわかりませんが、以下のコードを試してみました。 import subprocess import time subprocess.call(['Java', '-jar', '解析ソフト.jar']) time.sleep(10) print ("aa") 結果いくら待っていても、ターミナル上でソフトが起動するだけで"aa"の文字列はターミナル上に出てきませんでした
m.ts10806

2021/06/09 02:29

ではやはりコマンドライン上で待機状態になってますね。 起動用と入力用途別個に起動したとしてプロセスつかめないように思います。
pardeki

2021/06/09 02:41

むむむ、となると仰るような起動用と入力用を別個に用意してやっても実行するのは難しいのでしょうか…
m.ts10806

2021/06/09 02:45

そのjarが自身で改修できないものなら何もできることはないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問