Как вы используете стандартную библиотеку в IronPython?

Я префикс этот вопрос с: Нет, установка IRONPYTHONPATH не является ответом.

в любом случае...

Я планировал использовать IronPython в качестве замены Powershell для проекта, но я был в тупике, прежде чем я даже начал.

первое, что я попытался сделать, это использовать ОС.путь, в результате чего:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named os

после возни я, наконец, обнаружил, что могу использовать стандартную библиотеку, добавив ее вручную в путь:

import sys
sys.path.append(r"C:Program FilesIronPython 2.7Lib")
import os

однако, это глупая идея. Жесткое кодирование пути к библиотеке python внутри моих скриптов-это 100% гарантированный способ заставить их не работать в какой-то момент.

я обнаружил это почти сразу, когда попытался использовать скрипт на машине windows 7, и путь был немного другим ("Program Files (x86)").

Итак, несколько вопросов здесь:

1) почему так сложно использовать стандартную библиотеку? в по крайней мере, я бы подумал, что интерактивная Подсказка в VS и basic ipy.у exe было бы это.

2) Как определить каталог, в котором установлен iron python, независимо от используемой системы? (возможно, установщик IronPython устанавливает var?)

просто Примечание здесь; да, я видел некоторые другие сообщения, говорящие "установите свой IRONPYTHONPATH". Это бесполезно. Если у меня есть пустая машина, это означает, что я должен:

1) установить Установить IronPython

2) Запустите какой-нибудь сумасшедший скрипт powershell, чтобы найти, где когда-либо была установлена стандартная библиотека, и установите для нее глобальную переменную IRONPYTHONPATH.

3) запуск скриптов python

Я ищу лучший способ.

--

Edit:

тот факт, что я использую это для powershell, как вещи, в основном не имеет значения, но я пытаюсь достичь чего-то вроде:

import clr
from System.Management.Automation import RunspaceInvoke
import os

scriptRoot = os.getcwd()
runSpace = RunspaceInvoke()
cmdPath64 = os.join(scriptRoot, "..java...")
cmdPath32 = os.join(scriptRoot, "..java...")
proc = runSpace.Invoke("Get-WmiObject Win32_Processor ... ")
if proc.AddressWidth == 32:
  runSpace.Invoke(cmdPath32)
else:
  runSpace.Invoke(cmdPath64)

3 ответов


Я считаю, что для обеспечения того, чтобы все работало для третьих лиц, не являющихся разработчиками, обычно лучше использовать pyc.py для создания DLL и и исполняемый файл. Я обычно создаю DLL стандартных модулей python и ссылаюсь на это в коде. См. мой предыдущий ответ на этот вопрос IronPython: EXE скомпилирован с использованием pyc.py не удается импортировать модуль "os"


это немного трудоемко, но, учитывая, что каталог LIB ironpython установлен в папке program files x86 в 64-битных системах и на обычном пути к программным файлам в 32-битных системах, вы можете сделать следующим образом:

import sys
import System
if System.IntPtr.Size * 8 == 32: # detect if we are running on 32bit process
    sys.path.append(System.Environment.GetEnvironmentVariable("ProgramFiles") + "\IronPython 2.7\Lib")
else:
    sys.path.append(System.Environment.GetEnvironmentVariable("ProgramFiles(x86)") + "\IronPython 2.7\Lib")

import os # it works !!

здесь мы используем %ProgramFiles% и %ProgramFiles(x86)% чтобы определить путь, где установлен IronPython.

цитирование Википедии о %ProgramFiles% переменной (ссылке):

%ProgramFiles%

эта переменная указывает на каталог Program Files, в котором хранятся все установлена программа Windows и другие. По умолчанию на Англоязычные системы C:\Program файлы. В 64-разрядных версиях Windows (XP, 2003, Vista), есть также %ProgramFiles (x86)%, которые по умолчанию C:\Program файлы (x86) и %ProgramW6432% по умолчанию к C:\Program файлы. Сам %ProgramFiles% зависит от того, процесс запроса переменной среды сам по себе 32-разрядный или 64-разрядный (это вызвано 64-разрядным перенаправлением Windows-on-Windows).


Это очень странно, потому что если вы запустите установщик IronPython, а затем запустите C:\Program Files\IronPython 2.7\ipy.exe или C:\Program Files (x86)\IronPython 2.7\ipy.exe, вам не нужно ничего делать, чтобы stdlib доступен.