Jython-javaos.getenv()给出;获取环境失败,环境将为空;

Jython-javaos.getenv()给出;获取环境失败,环境将为空;,jython,Jython,每当我在Eclipse中运行任何jython程序时,在输出的开头都会出现以下错误: “未能 获得环境,环境将是 空:(0,'无法执行命令 ([\'sh\',\'-c\',\'env\']): java.io.IOException:无法运行 程序“sh”:Crea teProcess error=2, 系统找不到该文件 指定') 首先,我的环境是: Windows 2008 JDK 1.6.0u10 jython 2.2.1 我做了一些挖掘,发现这个消息是在函数javaos.getenv()中生

每当我在Eclipse中运行任何jython程序时,在输出的开头都会出现以下错误:

“未能 获得环境,环境将是 空:(0,'无法执行命令 ([\'sh\',\'-c\',\'env\']): java.io.IOException:无法运行 程序“sh”:Crea teProcess error=2, 系统找不到该文件 指定')

首先,我的环境是:

Windows 2008

JDK 1.6.0u10

jython 2.2.1

我做了一些挖掘,发现这个消息是在函数javaos.getenv()中生成的。 无论何时调用javaos.getenv()函数,它都会抛出以下错误:

C:\jython2.2.1>java-jarjython.jar

导入javaos

打印javaos.getenv(“user.name”)

无法获取环境,环境 将为空:(0,'无法执行 命令([\'sh\',\'-c\',\'env\']): java.io.IOException:无法运行 程序“sh”:Crea teProcess error=2, 系统找不到该文件 指定')


这很奇怪,因为我目前使用的是Windows计算机,而不是Unix。

很有趣。我似乎在这里找到了相关代码:


如果你往底部看,在设置环境命令时,jython似乎认为你的操作系统是posix”“我不知道那是什么。你是说Windows Server 2008吗?如果是这样的话,它是非常新的,如果您查看同一模块中的_getOsType函数,它对于该模块来说可能太新了。您可能需要升级到jython或Eclipse的最新版本。但是很可能他们还没有发布一个支持这个操作系统的版本。如果是这种情况,您可能需要向他们报告错误。

尝试取消注释并更改“注册表”文件中的操作系统设置

(它与jython.jar/i hope位于同一目录中)


我在Eclipse/PyDev下使用Windows Vista和Jython 2.5.1,通过编辑javaos.py,在getOsType中的OR语句中包含“Windows Vista”,遇到了相同的错误,; 我修正了错误。(我在SourceForge的PyDev跟踪器下提交了一个bug和修复程序。)

详情:

我安装了Jython的完整版本,这没有帮助。 我还尝试在Jython树中编辑“注册表”文件。这也无济于事

然后,我查看了中的文件:

C:\eclipse-platform-3.5-win32\eclipse\plugins\org.python.pydev.jython\u 1.4.8.2881\Lib

要查找“javaos.py”,并添加一些代码阅读:

def _getOsType( os=None ):
   os = os or sys.registry.getProperty( "python.os" ) or \
               java.lang.System.getProperty( "os.name" )

_osTypeMap = (
    ( "nt", r"(nt)|(Windows NT)|(Windows NT 4.0)|(WindowsNT)|"
            r"(Windows 2000)|(Windows XP)|(Windows CE)|(Windows Vista)" ),
    ( "dos", r"(dos)|(Windows 95)|(Windows 98)|(Windows ME)" ),
    ( "mac", r"(mac)|(MacOS.*)|(Darwin)" ),
    ( "None", r"(None)" ),
    ( "posix", r"(.*)" ), # default - posix seems to vary mast widely
    )
for osType, pattern in _osTypeMap:
    if re.match( pattern, os ):
        break
return osType
我在Windows7上运行。 我将Jython作为Websphere wsadmin工具中的脚本运行。 我遇到了同样的错误。 我将javaos.py中的这些行剪切粘贴到脚本中: os或sys.registry.getProperty(“python.os”)或\java.lang.System.getProperty(“os.name”) 它返回“WindowsVista”。
因此,我进行了与上述建议相同的手术,即将Windows Vista添加到javaos.py中,从而解决了我的问题。

我使用了Dave Brands博客中的这一技巧:


谢谢我在上提交了与此问题相关的bug。谢谢你的支持,谢谢。我从来不知道你可以在jar文件的同时拥有一个注册表文件!到目前为止,我只使用了一个jython.jar文件。
def _getOsType( os=None ):
   os = os or sys.registry.getProperty( "python.os" ) or \
               java.lang.System.getProperty( "os.name" )

_osTypeMap = (
    ( "nt", r"(nt)|(Windows NT)|(Windows NT 4.0)|(WindowsNT)|"
            r"(Windows 2000)|(Windows XP)|(Windows CE)|(Windows Vista)" ),
    ( "dos", r"(dos)|(Windows 95)|(Windows 98)|(Windows ME)" ),
    ( "mac", r"(mac)|(MacOS.*)|(Darwin)" ),
    ( "None", r"(None)" ),
    ( "posix", r"(.*)" ), # default - posix seems to vary mast widely
    )
for osType, pattern in _osTypeMap:
    if re.match( pattern, os ):
        break
return osType
try:
    import javaos
    if javaos._osType == 'posix' and \
            java.lang.System.getProperty('os.name').startswith('Windows'):
        sys.registry.setProperty('python.os', 'nt')
        reload(javaos)
except:
    pass