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

Я задам этот вопрос следующим образом: Нет, настройка IRONPYTHONPATH не является ответом.

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

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

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

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

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

import sys
sys.path.append(r"C:\Program Files\IronPython 2.7\Lib")
import os

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

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

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

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

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

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

1) Установите IronPython

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

3) Запуск сценариев python

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

-

Изменить:

Тот факт, что я использую это, чтобы делать 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)

Ответ 1

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

Ответ 2

Это немного оборвано, но, учитывая, что каталог LIB для ironpython установлен в папке с программными файлами 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 Files. В 64-битных версиях Windows (XP, 2003, Vista), есть также% ProgramFiles (x86)%, которые по умолчанию: C:\Program Files (x86) и% ProgramW6432%, которые по умолчанию в C:\Program Files. Сам% ProgramFiles% зависит от того, процесс, запрашивающий переменную окружения, сам по себе является 32-разрядным или 64-битным (это вызвано 64-разрядным перенаправлением Windows-on-Windows).

Ответ 3

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

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