Как вы используете стандартную библиотеку в IronPython? - PullRequest
11 голосов
/ 10 августа 2011

Я задам этот вопрос следующим образом: Нет, настройка 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% гарантированный способ заставить их не работать в какой-то момент.

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

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

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

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

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

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

2) Запустить какой-нибудь сумасшедший сценарий powershell, чтобы найти, где вообще была установлена ​​стандартная библиотека.и установите для него глобальную переменную 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)

Ответы [ 3 ]

2 голосов
/ 13 августа 2011

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

1 голос
/ 10 августа 2011

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

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

1 голос
/ 10 августа 2011

Это немного обходной путь, но, учитывая, что каталог 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).

...