我正在嘗試做這樣的事情:
Future<String> getOutAndAnswer(testcase) async {
Process python = await Process.start('python', ['tasks/histogram/run.py']);
Process java = await Process.start('java', ['solutions/Histogram.java']);
String results = "";
for(int i = 0; i < testcase; i ){
final String out = await python.stdout.transform(utf8.decoder).first;
java.stdin.writeln(out);
final String answer = await java.stdout.transform(utf8.decoder).first;
python.stdin.writeln(answer);
results = "($out, $answer)";
}
return results;
}
基本上,python 程式負責生成每個測驗用例的輸入,然后 java 程式將獲取輸入并回傳答案,然后將其發送給 python 程式以檢查它是否正確,等等。案子。
但是當我嘗試使用上面的代碼時,我得到一個錯誤,說我已經聽過一次流了:
Exception has occurred.
StateError (Bad state: Stream has already been listened to.)
蟒蛇程式:
import os
CASE_DIR = os.path.join(os.path.dirname(__file__), "cases")
test_cases = next(os.walk(CASE_DIR))[2]
print(len(test_cases))
for case in sorted(test_cases):
with open(os.path.join(CASE_DIR, case), 'r') as f:
print(f.readline(), end='', flush=True)
f.readline()
expected_output = f.readline()
user_output = input()
if expected_output != user_output:
raise ValueError("Wrong answer!")
print("EXIT", flush=True)
Java程式:
public class Histogram {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int t = scanner.nextInt();
for (int i = 0; i < t; i ) {
String input = scanner.nextLine();
String answer = calculateAnswer(input);
System.out.println(answer);
}
}
}
uj5u.com熱心網友回復:
您的問題是.first哪個要監聽流,獲取第一個元素,然后立即停止監聽流。請參閱此處的檔案:https ://api.dart.dev/stable/2.17.3/dart-async/Stream/first.html
相反,您應該聽一次并定義一種onData方法來執行這些步驟。請參閱.listen()此處的檔案:https ://api.dart.dev/stable/2.17.3/dart-async/Stream/listen.html
uj5u.com熱心網友回復:
您可以嘗試將標準輸出流包裝在StreamIterator<String>. 您將不得不嘗試驗證,但我認為這就是您正在尋找的。
Future<String> getOutAndAnswer(int testcase) async {
Process python = await Process.start('python', ['tasks/histogram/run.py']);
Process java = await Process.start('java', ['solutions/Histogram.java']);
String results = "";
StreamIterator<String> pythonIterator = StreamIterator(
python.stdout.transform(utf8.decoder).transform(LineSplitter()));
StreamIterator<String> javaIterator = StreamIterator(
java.stdout.transform(utf8.decoder).transform(LineSplitter()));
for (int i = 0; i < testcase; i ) {
if (await pythonIterator.moveNext()) {
final String out = pythonIterator.current;
if (out == 'EXIT') {
break;
}
java.stdin.writeln(out);
if (await javaIterator.moveNext()) {
final String answer = javaIterator.current;
python.stdin.writeln(answer);
results = "($out, $answer)";
}
}
}
await pythonIterator.cancel();
await javaIterator.cancel();
return results;
}
您可能需要添加以下匯入:
import 'dart:async';
import 'dart:convert';
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/486648.html
上一篇:創建了一個應用程式來學習在flutterapp專案中添加rive閃屏影片
下一篇:重定向時發送訊息
