2011-08-10 7 views
11

Voy a prefijar esta pregunta con: No, el ajuste IRONPYTHONPATH no es la respuesta.¿Cómo se usa la biblioteca estándar en IronPython?

En fin ...

que estaba planeando sobre el uso de IronPython como un reemplazo para Powershell para un proyecto, pero me han confundido antes de haber siquiera empecé.

La primera cosa que traté de hacer fue os.path uso, lo que resulta en:

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

Después de jugar un poco, finalmente descubrí que podía usar la biblioteca estándar agregando manualmente a la ruta:

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

Sin embargo, esta es una idea tonta. La codificación rigurosa del camino a la biblioteca de Python dentro de mis scripts es una forma 100% garantizada de hacer que no funcionen en algún momento.

Descubrí esto casi de inmediato cuando traté de usar la secuencia de comandos en una máquina con Windows 7 y la ruta era ligeramente diferente ('Archivos de programa (x86)').

Así, un par de preguntas aquí:

1) Por qué es tan difícil de usar la biblioteca estándar? Por lo menos, hubiera pensado que el mensaje interactivo en VS y el ipy.exe básico tendrían esto.

2) ¿Cómo puedo determinar el directorio en el que iron python está instalado, independientemente del sistema que estoy usando? (instalador de IronPython configurando una var quizás?)

Solo una nota aquí; sí, he visto otras publicaciones que dicen "configure su IRONPYTHONPATH". Esto en inútil. Si tengo una máquina en blanco que significa que tengo que:

1) Instalar IronPython

2) Ejecutar una secuencia de comandos PowerShell loca a buscar a donde quiera-la-diablos se instaló la biblioteca estándar y establecer un mundial IRONPYTHONPATH variable a ella.

3) Ejecutar los guiones pitón

estoy en busca de una mejor manera.

-

Editar:

El hecho de que estoy usando esto para hacer que las cosas PowerShell es básicamente irrelevante, pero estoy tratando de lograr algo como:

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

¿Podría mostrar un script de ejemplo de lo que intentaría hacer y cómo piensa utilizarlo? No estoy seguro de entender cuál es el problema. –

+0

ver la edición anterior. Sin embargo, esto es básicamente irrelevante para mi pregunta. – Doug

Respuesta

2

Me parece que para garantizar que todo funcione para terceros no desarrolladores, generalmente es mejor usar pyc.py para crear archivos DLL y ejecutable. De forma rutinaria creo una DLL de los módulos estándar de python y hago referencia a eso en el código. Ver mi respuesta anterior a esta pregunta IronPython: EXE compiled using pyc.py cannot import module "os"

+0

Eso no acaba de responder mi pregunta, pero _hace_ funcionar, y es, con mucho, la mejor solución que he encontrado hasta ahora. ¡Gracias! – Doug

1

Es un poco de solución pero, dado que el directorio LIB de ironpython está instalado bajo la carpeta de archivos de programa x86 en sistemas de 64 bits y en la ruta habitual de archivos de programa en sistemas de 32 bits, puede hacerlo de esta manera:

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

Aquí se utiliza %ProgramFiles% y %ProgramFiles(x86)% para determinar la ruta donde está instalado IronPython.

Citando a Wikipedia %ProgramFiles% variable (link):

% Archivos de programa%

Esta variable apunta a Archivos de programa de directorio, que almacena toda la programa instalado de Windows y otros. El valor predeterminado en en los sistemas en inglés es C: \ Archivos de programa. En las ediciones de 64 bits de Windows (XP, 2003, Vista), también hay% ProgramFiles (x86)% que se predetermina a C: \ Archivos de programa (x86) y% ProgramW6432% que predetermina a C: \ Archivos de programa . El% ProgramFiles% en sí mismo depende de si el proceso que solicita la variable de entorno es de 32 bits o de 64 bits (esto es causado por la redirección de Windows-en-Windows de 64 bits).

+0

He compilado mi script usando pyc.py pero durante la ejecución, sigo obteniendo esto: Excepción no controlada: IronPython.Runtime.Exceptions.ImportException: Ningún módulo llamado os. Sin embargo, una vez que agregué sys.path.append (System.Environment.GetEnvironmentVariable ("ProgramFiles (x86)") + "\ IronPython 2.7 \ Lib") ¡funcionó! – Gezim

1

Esto es muy extraño, porque si se ejecuta el instalador IronPython, y luego ejecutar C:\Program Files\IronPython 2.7\ipy.exe o C:\Program Files (x86)\IronPython 2.7\ipy.exe, que no es necesario hacer nada para tener la stdlib disponible.

Supongo que tiene más de un IronPython y está ejecutando el incorrecto, pero solo porque no puedo pensar en otra razón para que esto suceda. Se supone que solo funciona.

+0

Tengo el mismo problema: si ejecuto un script desde un proyecto VS 2010 C# que contiene la línea "import os" obtengo el mismo error; se soluciona si agrego la ruta Lib manualmente. IronPython.dll en la referencia de proyectos es 2.7. – digEmAll

+1

Me encantaría si solo funcionara. :/(y no, no tengo varias copias de iron python). – Doug

Cuestiones relacionadas