#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. Я думаю, вы также хотите удалить режим ожидания … тогда это выглядит хорошо, и я удалю понижающий голос.