2016-01-07 4 views
0

Как выполнить пакетный файл в задаче, заданной с помощью модуля 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 
+0

Моя проблема связана с контекстом virtualenv: я не могу выполнить batchfile deactivate.bat, поскольку он деактивирует virtualenv, в котором установлен модуль укладчика и в котором выполняется команда укладчика. Я могу выполнить другой пакетный файл, который не связан с virtualenv. Я отредактирую вопрос, относящийся к его заголовку. – thinwybk

+0

Можно [вызывать .bat файлы из linux с помощью вина] (http://www.linux.org/threads/running-windows-batch-files-on-linux.7610 /) – thinwybk

+0

У Paver есть поддержка virtualenv, которая позволяет использовать декоратор @virtualenv (dir = "venv") для определения виртуальной среды, в которой должна выполняться задача. Это требует, чтобы модуль ** укладчик ** был установлен в виртуальном виртуальном пространстве python, который используется для вызова команд укладчика проекта. – thinwybk

ответ

Смежные вопросы