2011-08-10 17 views
11

Przedłużę to pytanie: Nie, Ustawienie IRONPYTHONPATH nie jest odpowiedzią.Jak korzystać ze standardowej biblioteki w IronPython?

Zresztą ...

I planuje przy użyciu IronPython jako zamiennik PowerShell dla projektu, ale byłem zakłopotany przed I już nawet zaczęło.

Pierwszą rzeczą próbowałem zrobić to wykorzystanie os.path, powodując:

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

Po aprowizacji w końcu odkrył mogę użyć standardowej biblioteki, dodając je ręcznie do ścieżki:

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

Jest to jednak głupi pomysł. Twarde kodowanie ścieżki do biblioteki Pythona wewnątrz moich skryptów jest 100% gwarancją, że nie będą one działać w pewnym momencie.

Odkryłem to prawie natychmiast, gdy próbowałem użyć skryptu na komputerze z systemem Windows 7, a ścieżka była nieco inna ("Program Files (x86)").

więc kilka pytań tutaj:

1) Dlaczego tak trudno jest korzystać z biblioteki standardowej? Przynajmniej pomyślałbym, że interaktywny monit w VS i podstawowy ipy.exe miałby to.

2) Jak określić katalog, w którym instalowany jest żelazny python, niezależnie od używanego systemu? (Instalator IronPython ustawiający var prawdopodobnie?)

Tu tylko treść; tak, widziałem kilka innych wpisów mówiących "ustaw twoją IRONPYTHONPATH". To nieprzydatne. Jeśli mam pustą maszynę, która oznacza, że ​​muszę:

1) Instalacja IronPython

2) Uruchom jakiś szalony skryptu powershell, aby szukać gdzie-ever-the-cholery średnia biblioteki był zainstalowany i ustawić globalny IRONPYTHONPATH zmienna do niego.

3) Uruchom skrypty python

szukam lepszy sposób.

-

Edit:

Fakt Używam tego zrobić powershell jak rzeczy jest w zasadzie bez znaczenia, ale staram się osiągnąć coś takiego:

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) 
+0

Czy możesz pokazać przykładowy scenariusz tego, co chciałbyś zrobić i jak zamierzasz go użyć? Nie jestem pewien, czy rozumiem, jaki jest problem. –

+0

patrz edycja powyżej. Jest to jednak zasadniczo nieistotne dla mojego pytania. – Doug

Odpowiedz

2

Uważam, że dla upewnienia się, że wszystko działa dla osób niebędących programistami, zwykle lepiej jest użyć pyc.py do utworzenia plików DLL i plików wykonywalnych. Rutynowo tworzę bibliotekę DLL standardowych modułów Pythona i odwołuję się do niej w kodzie. Zobacz moją poprzednią odpowiedź na to pytanie. IronPython: EXE compiled using pyc.py cannot import module "os"

+0

To niezupełnie odpowiada na moje pytanie, ale jest to praca, która jest zdecydowanie najlepszym rozwiązaniem, jakie do tej pory znalazłem. dzięki! – Doug

1

To trochę obejść, ale biorąc pod uwagę, że katalog LIB z ironpythonem jest zainstalowany pod folderem plików programów x86 w systemach 64-bitowych i na zwykłej ścieżce plików programów w systemach 32-bitowych, można zrobić w ten sposób:

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 !! 

Tutaj używamy %ProgramFiles% i %ProgramFiles(x86)% określić ścieżkę, w której jest zainstalowany IronPython.

Cytując Wikipedię o %ProgramFiles% zmiennej (link):

% ProgramFiles%

tej zmiennej punktów do katalogu Program Files, które przechowuje wszystkie zainstalowany program Windows i innych. Domyślnym językiem systemów w języku angielskim jest C: \ Program Files. W 64-bitowych wersjach Windows (XP, 2003, Vista), są również% ProgramFiles (x86)%, które domyślnie są C: \ Program Files (x86) i% ProgramW6432%, który domyślnie na C: \ Program Files . Sam% ProgramFiles% zależy od tego, czy proces żądający zmiennej środowiskowej sam jest 32-bitowy czy 64-bitowy (jest to spowodowane 64-bitowym przekierowaniem Windows na Windowsie).

+0

Skompilowałem skrypt za pomocą pyc.py, ale podczas wykonywania otrzymywałem: Nieobsługiwany wyjątek: IronPython.Runtime.Exceptions.ImportException: Brak modułu o nazwie os. Jednak po dodaniu sys.path.append (System.Environment.GetEnvironmentVariable ("ProgramFiles (x86)") + "\ IronPython 2.7 \ Lib" działało! – Gezim

1

To jest bardzo dziwne, bo jeśli uruchomić instalator IronPython, a następnie uruchomić C:\Program Files\IronPython 2.7\ipy.exe lub C:\Program Files (x86)\IronPython 2.7\ipy.exe, nie ma potrzeby niczego robić, aby mieć stdlib dostępne.

Domyślam się, że masz więcej niż jeden IronPython i używasz niewłaściwego, ale tylko dlatego, że nie mogę wymyślić innego powodu, by tak się stało. To ma po prostu działać.

+0

Mam ten sam problem: jeśli uruchomię skrypt z projektu VS 2010 C# zawierającego wiersz "import os", pojawia się ten sam błąd; Naprawiono go, jeśli ręcznie dodam ścieżkę Lib. IronPython.dll w odwołaniach do projektów to 2.7. – digEmAll

+1

Uwielbiam to na kawałki, jeśli tylko zadziałało. :/(i nie, nie mam wielu kopii żelaznego pythona). – Doug

Powiązane problemy