Искал для этого и не мог найти никого, кто уже спросил, так вот.
Я начинаю переключиться на IPython как на свою оболочку в Windows 7, и я бы хотел настроить ее так, чтобы магическая ошибка (!cmd
) передавала команду в системную оболочку, используя PowerShell вместо cmd.exe, так что я могу воспользоваться усовершенствованиями, выполненными MS, но без необходимости менять мой %COMSPEC%
на PowerShell (моя компания по-прежнему использует несколько байт на базе CMD для автоматизации, и я не хочу чтобы сломать их).
Я поставил свои вопросы здесь наверху, так как ответ может не требовать какой-либо информации ниже:
- Я что-то упустил? Есть ли способ использовать конфигурационный файл в IPython для указания интерпретатора системных команд?
- Если! 1, есть ли способ, которым я не могу запустить дочерний процесс из PowerShell с переменной окружения Machine-scope, которая является локальной для этого процесса?
Исследование/Тестирование
Просматривая код IPython, я вижу, что он использует os.system()
для отправки команды в оболочку, а не subprocess.call()
. Это делает вещи несколько более сложными, так как os.system * просто использует COMSPEC, где с подпроцессом * вы можете указать исполняемый файл для использования.
Я попытался загрузить PowerShell, установив переменную $env:comspec
, а затем запустив IPython из этой оболочки, но даже несмотря на то, что COMSPEC появляется, даже внутри IPython, похоже, что CMD все еще используется:
[PS] C:\> $env:comspec
C:\Windows\system32\cmd.exe
[PS] C:\> $env:comspec = 'powershell.exe'
[PS] C:\> $env:comspec
powershell.exe
[PS] C:\> & 'C:\Python33\Scripts\ipython3.exe'
Python 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:03:43) [MSC v.1600 32 bit (Intel)]
Type "copyright", "credits" or "license" for more information.
IPython 1.1.0 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython features.
%quickref -> Quick reference.
help -> Python own help system.
object? -> Details about 'object', use 'object??' for extra details.
In [1]: import os; os.getenv('comspec')
Out[1]: 'powershell.exe'
In [2]: !gci
'gci' is not recognized as an internal or external command,
operable program or batch file.
In [3]: os.system('gci')
'gci' is not recognized as an internal or external command,
operable program or batch file.
Out[3]: 1
Похоже, что локально модифицированный COMSPEC передается на IPython (как дочерний процесс PowerShell, который сделал локальное изменение), но os.system
по-прежнему использует постоянную настройку.
Я попробовал что-то подобное, используя [Environment]::SetEnvironmentVariable("ComSpec", 'powershell.exe', [System.EnvironmentVariableTarget]::User)
, в случае, если мне удастся сменить переменную среды пользовательской области, но это тоже не сработало (то же самое, что и выше - os.getenv('ComSpec')
показывает powershell, но! -ed команды отправляются в CMD).
Изменение переменной окружения Machine-scope, похоже, делает то, что я хочу, но для вас это не подходит, по причинам, упомянутым ранее.
[PS] C:\> $env:comspec
C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe
[PS] C:\> [Environment]::GetEnvironmentVariable('ComSpec','User')
[PS] C:\> [Environment]::GetEnvironmentVariable('ComSpec','Machine')
C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe
[PS] C:\> & 'C:\Python33\Scripts\ipython3.exe'
Python 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:03:43) [MSC v.1600 32 bit (Intel)]
Type "copyright", "credits" or "license" for more information.
IPython 1.1.0 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython features.
%quickref -> Quick reference.
help -> Python own help system.
object? -> Details about 'object', use 'object??' for extra details.
In [1]: !gci env:ComSpec
Name Value
---- -----
ComSpec C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe
Поскольку это не жизнеспособное текущее решение, я проверил еще несколько, переделывая настройки в ConEmu *. Я смог сделать это, не изменяя глобальную переменную, установив переменную среды Explicit executable и Set ComSpec для дочерних процессов на выбранные флаги значения * в настройках > Запуск > ComSpec и предоставив путь к powershell.exe, но я не если это будет иметь негативное влияние на консоли CMD, открытые с помощью ConEmu, так как эта настройка является глобальной (внутри ConEmu). Это привело меня к тому, чтобы задать вопрос 2 выше, так как я не уверен, как установить переменные среды Work-scope в PowerShell (если это возможно даже возможно).
В конце концов, моя цель мечты состояла бы в том, чтобы IPython поддерживал спецификацию интерпретатора командной оболочки через конфигурационный файл, но для этого os.system()
не может быть использованным. Я планирую возиться с заменой его на subprocess.call()
в моей локальной копии (a'la this Python Doc), чтобы проверить, но если кто-то уже играл с этим, или если есть достаточное преимущество для текущей модели с использованием subprocess
, о котором я не знаю, я был бы рад услышать об этом. Похоже, что это уже делается для не-Windows-систем (GitHub), но я достаточно новичок для Python в этом масштабе, который я не могу сказать наверняка, что ничто другое не сломается, если это изменение также использовалось на стороне Windows для условного.
Сноска
Г! Должны иметь репутацию 10+, чтобы правильно документировать вопросы. Вот ссылки, на которые мне не разрешалось публиковать сообщения выше:
- os.system - docs.python.org/3.3/library/os.html#os.system
- subprocess - docs.python.org/3.3/library/subprocess.html
- ConEmu - code.google.com/p/conemu-maximus5/