Как выполнить пакетный файл в задаче, заданной с помощью модуля python paver? Должен ли я различать, какая операционная система (unix/windows) выполнит задачу укладчика?Выполнение .bat-файла из задачи-накладчика
E.g. следующая задача определена в pavement.py в корневой директории проекта делает выполнение всех модульных тестов (определяется модулем питона стандартной библиотеки UnitTest) определены в проекте
from paver.tasks import task
from paver.easy import sh
@task
def unit_tests():
"""
Run all unit tests.
"""
sh('python -m unittest')
если кто-то выполнить
paver unit_tests
из командной строки в корневом каталоге проектов.
Однако я не в состоянии выполнить пакетник файл на окнах операционной системы (находится в корневой директории проекта) с
sh('batchfile.bat')
Я также не в состоянии выполнить пакетный файл в подкаталоге venv/Сценарии из проектов корневого каталога с помощью УХО аргумент ш() [paver source code] с одним из следующих вариантов
# no call does execute the batch file (*cwd* alternatives)
sh('batchfile.bat', cwd='venv/Scripts')
sh('cmd /c batchfile.bat', cwd='venv/Scripts')
# no call does execute the batch file (*sh()* "sequential command" syntax alternatives)
sh('cd venv/Scripts; deactivate.bat')
sh('cd venv/Scripts; cmd /c deactivate.bat')
# this sequence does also not execute the batch file (absolute path alternative)
path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'venv\Scripts')
sh('deactivate.bat', cwd=path)
EDIT:
Я создал пакетный файл hello_world.bat не связанный с "обработкой virtualenv" в корневом каталоге и venv подкаталог/Scripts /:
@echo off
echo hello world
pause
Calling
paver root_dir_call
или
paver sub_dir_call
в корневой директории проекта на окне с дополнительными задачами асфальтоукладчика в pavement.py сделать выполнить пакетный файл, do execute the batch file with side effects или не выполнить командный файл, в зависимости от конкретного незакомментированного ш() команды:
@task
def root_dir_call():
# use one of these two calls!
sh('hello_world.bat') # PASS
#sh('hello_world') # PASS
# do not use other calls like these two because they have side effects or do not execute the batch file at all
#sh('call hello_world.bat') # PASS (execution with side effects)
#sh('cmd /c hello_world.bat') # PASS (execution with side effects)
#sh('start hello_world.bat') # PASS (execution with side effects)
#sh('cmd hello_world.bat') # FAIL (no execution, output of cmd!?)
и
@task
def sub_dir_call():
# use one of these calls!
sh('hello_world.bat', cwd='venv/Scripts/') # PASS
#sh('hello_world', cwd='venv/Scripts') # PASS
#sh('hello_world', cwd='venv\Scripts') # PASS
# following calls do not execute the batch file
#sh('cd venv/Scripts; hello_world.bat') # FAIL
#sh('cd venv/Scripts/; hello_world.bat') # FAIL
#sh('cd venv\Scripts\; hello_world.bat') # FAIL
#sh('cd venv/Scripts; cmd /c hello_world.bat') # FAIL
Моя проблема связана с контекстом virtualenv: я не могу выполнить batchfile deactivate.bat, поскольку он деактивирует virtualenv, в котором установлен модуль укладчика и в котором выполняется команда укладчика. Я могу выполнить другой пакетный файл, который не связан с virtualenv. Я отредактирую вопрос, относящийся к его заголовку. – thinwybk
Можно [вызывать .bat файлы из linux с помощью вина] (http://www.linux.org/threads/running-windows-batch-files-on-linux.7610 /) – thinwybk
У Paver есть поддержка virtualenv, которая позволяет использовать декоратор @virtualenv (dir = "venv") для определения виртуальной среды, в которой должна выполняться задача. Это требует, чтобы модуль ** укладчик ** был установлен в виртуальном виртуальном пространстве python, который используется для вызова команд укладчика проекта. – thinwybk