Печатать вывод терминала в файл при вызове java из python

Я запускаю код Java (используя maven) из python.

    with changeDir(runDir):
        print "mvn clean"
        subprocess.call(["mvn clean"], shell=True)
    with changeDir(runDir):
        print "mvn compile"
        subprocess.call(["mvn compile"], shell=True)
    print "compile time",datetime.now() - startTime     
    with changeDir(runDir):
        print "mvn package"
        subprocess.call(["mvn package -DskipTests=true"], shell=True)
    with changeDir(runDir):
        subprocess.call(["export MAVEN_OPTS=\"-Xmx10g -Xms10g -XX:MaxPermSize=10g -XX:+UseConcMarkSweepGC -XX:-UseGCOverheadLimit\""], shell=True)
        print "mvn exec"
        subprocess.call(["mvn exec:java -Dexec.mainClass=examples.Example -Dexec.args=\"pathToFile"+fname+"\""], shell=True)

В отличие от командной строки, когда я пытаюсь выполнить выполнение во внешнем файле, таком как out.txt, он сначала распечатывает вывод Java, а затем вывод python.

Первый вывод Java

[INFO] Scanning for projects...
[INFO] Inspecting build with total of 1 modules...
[INFO] Installing Nexus Staging features:
....
..

Затем вывод python

mvn clean
mvn compile
compile time 0:00:08.027680
mvn package
mvn exec

но когда я не пытаюсь распечатать вывод терминала во внешнем файле, в терминале я вижу, что он распечатывается в соответствии с порядком того, что находится в моем коде:

mvn clean
    [INFO] Scanning for projects...
    [INFO] Inspecting build with total of 1 modules...
    [INFO] Installing Nexus Staging features:
....
..
mvn compile
    [INFO] Scanning for projects...
    [INFO] Inspecting build with total of 1 modules...
    [INFO] Installing Nexus Staging features:

Почему это происходит

Я бы сказал, что эту проблему можно решить, очистив ваши потоки. Например, предполагая, что и Java, и Python записывают на стандартный вывод (не стандартная ошибка), вы можете попробовать написать print("mvn clean", flush=True) - Отказ от ответственности: я тестировал это только с Python3, а вы, похоже, полагаетесь на синтаксис Python2.

ErikMD 26.05.2018 16:07

Согласно этому ТАК ответ, можно сделать sys.stdout.flush() для сброса stdout в Python2…

ErikMD 26.05.2018 16:10

Два несвязанных замечания: (яя>) возможно, вам следует использовать subprocess.check_call, если вы хотите вызвать исключение при сбое команды запуска; (ii) Я предполагаю, что команда export MAVEN_OPTS запускается в подоболочке, поэтому последняя команда оболочки, которую вы запускаете в своем скрипте Python, не будет знать о переменной MAVEN_OPTS, введенной предпоследним.

ErikMD 26.05.2018 16:18
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
137
0

Другие вопросы по теме