Изменить: мой окончательный код выглядит примерно так:
#WARNING: all " in command need to be escaped: \\"
def spawnInNewTerminal(command):
#creates lock file
lock = open(lockPath, 'w')
lock.write("Currently performing task in separate terminal.")
lock.close()
#adds line to command to remove lock file
command += ";rm " + lockPath
#executes the command in a new terminal
process = subprocess.Popen (
['x-terminal-emulator', '-e', 'sh -c "{0}"'.format(command) ]
, stdout=subprocess.PIPE )
process.wait()
#doesn't let us proceed until the lock file has been removed by the bash command
while os.path.exists(lockPath):
time.sleep(0.1)
Оригинальный вопрос:
Я пишу простую оболочку, которая устанавливает все отсутствующие пакеты «на лету» перед окончательным запуском LuaLaTeX. В основном это работает, но ближе к концу мне нужно запустить команду
sudo tlmgr install [string of packages]
и, кроме того, поскольку нет никакой гарантии, что редактор LaTeX позволит пользователю вводить данные, мне нужно вызвать новый терминал, чтобы сделать это, чтобы они могли ввести свой пароль sudo.
Я в основном понял это: либо
process = subprocess.Popen(
shlex.split('''x-terminal-emulator -t \'Installing new packages\' -e \'sudo tlmgr install ''' + packagesString + '''\''''), stdout=subprocess.PIPE)
retcode = process.wait()
or
os.system('''x-terminal-emulator -t \'Installing new packages\' -e \'sudo tlmgr install ''' + packagesString + '''\'''')
Единственная проблема заключается в том, что эта строка не ожидает завершения порожденного терминального процесса. На самом деле, он сразу же переходит к следующей строке (запускает реальный LuaLaTeX), прежде чем пользователь сможет даже ввести свой пароль или загрузить пакеты!
Насколько я понимаю, это потому, что дочерний процесс sudo завершается сразу. Есть ли способ убедиться, что процесс tlmgr завершится, прежде чем продолжить?