- Удалить часть
shell=True
. Ваша оболочка не имеет к этому никакого отношения. Использование shell=True
является частой причиной проблем.
- Использовать список параметров для cmd.
Пример:
cmd = ['cvs',
'-d:pserver:anonymous@bayonne.cvs.sourceforge.net:/cvsroot/bayonne',
'login']
p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
Это не блокирует мою систему (мой скрипт продолжает выполняться).
Однако, поскольку cvs читает пароль непосредственно из терминала (не из стандартного ввода или вывода), вы не можете просто записать пароль в подпроцесс 'stdin.
Вместо этого вы можете передать пароль как часть спецификации CVSROOT, например:
:pserver:<user>[:<passwd>]@<server>:/<path>
т.е. функция для входа в проект sourceforge:
import subprocess
def login_to_sourceforge_cvs(project, username='anonymous', password=''):
host = '%s.cvs.sourceforge.net' % project
path = '/cvsroot/%s' % project
cmd = ['cvs',
'-d:pserver:%s:%s@%s:%s' % (username, password, host, path),
'login']
p = subprocess.Popen(cmd, stdin=subprocess.PIPE,
stdout=subprocess.PIPE
stderr=subprocess.STDOUT)
return p
Это работает для меня. Вызов
login_to_sourceforge_cvs('bayonne')
Анонимно войдет в cvs проекта Байонна.