Запустите сборку для кода C (make) в скрипте Python

#python #c #shell #scripting

#python #c #оболочка #сценарии

Вопрос:

Я продолжаю сталкиваться с ошибкой, когда хочу скомпилировать код, написанный на C , используя скрипт Python для запуска «make» в каталоге x. Компиляция кода занимает около нескольких секунд, поэтому я использую модуль time, чтобы перевести скрипт в режим ожидания на 60 секунд для завершения компиляции кода.

Вот код:

 from subprocess import call
from time import sleep
def make_ut_adsmain():
        os.system("make ../../ads/main/unittest")
        # call(["ls", "-l"])
        sleep(60)

make_ut_adsmain()

# Run other functions when compiled...
  

Ошибка

 make: *** No rule to make target `../../ads/main/unittest'.  Stop.
  

Код никогда не компилируется, потому что остальная часть кода зависит от файла журнала, который никогда не создается. Пожалуйста, направьте меня.

Комментарии:

1. Работает ли запуск make вручную в этом каталоге? Это не указывает на то, что python не может найти Makefile

2. да, это так. Я просто смог это решить. Опубликовал решение ниже.

Ответ №1:

Я действительно понял это и смог запустить процесс сборки, используя следующий код:

 import subprocess
from time import sleep
def make_ut_adsmain():
        subprocess.Popen(["make"], stdout=subprocess.PIPE, cwd="../../ads/main/unitest")
        sleep(60)

make_ut_adsmain()
  

Обратите внимание, предыдущее решение работает, только если вам нужно обойти ошибки. Правильный способ сделать следующее. Проверьте комментарий @tdelaney и прочитайте больше в документах python https://docs.python.org/2/library/subprocess.html

 import subprocess
from time import sleep
def make_ut_adsmain():
        subprocess.check_all(["make"], cwd="../../ads/main/unitest")

make_ut_adsmain()
  

Комментарии:

1. Это имеет серьезные проблемы. Вы исправляете одну проблему, изменяя cwd , но создаете stdout канал, но затем не читаете его (make будет заблокирован, если он напечатает кучу данных), а затем вы просто спите произвольные 60 секунд вместо ожидания завершения вызова. Как минимум, сделайте subprocess.check_call(["make"], cwd="../../ads/main/unitest") ) и полностью избавьтесь от сна.

2. Спасибо @tdelaney: я прочитал документы, и это имеет смысл. Но ваше минимальное решение выдает ошибку: подпроцесс. Вызванный processerror: команда ‘[‘make’]’ вернула ненулевой статус выхода 2.

3. Это здорово! Это означает, что make не удался, и вам нужно это выяснить. Ваш исходный скрипт молча игнорировал ошибки.

4. @tdelaney Теперь я понял. Но для моих целей тестирования на моей машине разработчика мне все равно нужно придерживаться моего первоначального решения, потому что есть ошибка, которую мне нужно игнорировать и выполнить, запустив скомпилированный двоичный файл. Спасибо за совет! (Кроме того, было бы здорово, если бы вы могли удалить downvote), поскольку это не относится к тому, что я ищу. Спасибо.

5. Я думаю, вы также хотите удалить режим ожидания … тогда это выглядит хорошо, и я удалю понижающий голос.