`
雨过天晴0521
  • 浏览: 161112 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Jython的os.name问题

 
阅读更多
下面的这段脚本是在python中调用java来运行ant命令, 可以在Jython中却运行失败, 找不到ant的Main类, 什么原因呢?

#!/usr/bin/python
"""

 runant.py
 Assumptions:

 - the "java" executable/script is on the command path
 - ANT_HOME has been set
"""
import os, os.path, string, sys

# Change it to 1 to get extra debug information
debug = 0

#######################################################################
#
# check to make sure environment is setup
#
if not os.environ.has_key('ANT_HOME'):
	print '\n\nANT_HOME *MUST* be set!\n\n'
	sys.exit(1)
else:
	ANT_HOME = os.environ['ANT_HOME']

if not os.environ.has_key('JAVACMD'):
	JAVACMD = 'java'
else:
	JAVACMD = os.environ['JAVACMD']

# Sets the separator char for CLASSPATH
SEPARATOR = ':'
if os.name == 'dos' or os.name == 'nt':
	SEPARATOR = ';'

# Build up standard classpath
localpath = ''
if os.environ.has_key('CLASSPATH'):
	localpath = os.environ['CLASSPATH']
else:
	if debug:
		print 'Warning: no initial classpath\n'

# Add jar files
LIBDIR = os.path.join(ANT_HOME, 'lib')
jarfiles = []
for file in os.listdir(LIBDIR):
	if file[-4:] == '.jar':
		jarfiles.append(os.path.join(LIBDIR,file))
if debug:
	print 'Jar files:'
	for jar in jarfiles:
		print jar
localpath = localpath + SEPARATOR + string.join(jarfiles, SEPARATOR)

# If JAVA_HOME is defined, look for tools.jar & classes.zip
# and add to classpath
if os.environ.has_key('JAVA_HOME') and os.environ['JAVA_HOME'] != '':
	JAVA_HOME = os.environ['JAVA_HOME']
	TOOLS = os.path.join(JAVA_HOME, os.path.join('lib', 'tools.jar'))
	if os.path.exists(TOOLS):
		localpath = localpath + SEPARATOR + TOOLS
	CLASSES = os.path.join(JAVA_HOME, os.path.join('lib', 'classes.zip'))
	if os.path.exists(CLASSES):
		localpath = localpath + SEPARATOR + CLASSES
else:
	print '\n\nWarning: JAVA_HOME environment variable is not set.\n', \
		'If the build fails because sun.* classes could not be found\n', \
		'you will need to set the JAVA_HOME environment variable\n', \
		'to the installation directory of java\n'

# Jikes
ANT_OPTS = []
if os.environ.has_key('ANT_OPTS'):
	ANT_OPTS = string.split(os.environ['ANT_OPTS'])
if os.environ.has_key('JIKESPATH'):
	ANT_OPTS.append('-Djikes.class.path=' + os.environ['JIKESPATH'])

# Builds the commandline
cmdline = '%s -classpath %s -Dant.home=%s %s org.apache.tools.ant.Main %s' \
	 % (JAVACMD, localpath, ANT_HOME, string.join(ANT_OPTS,' '), \
	 	string.join(sys.argv[1:], ' '))

if debug:
	print '\n%s\n\n' % (cmdline)

# Run the biniou!
os.system(cmdline)



首先想到classpath配的有问题, 的确如此. 如果你在Jython中运行下面这段脚本, 会发现ant.jar的前的分隔符是':', 我是在windows上运行的所以应该是';' 但这段关于分隔符的判定有似乎没问题

# Sets the separator char for CLASSPATH
SEPARATOR = ':'
if os.name == 'dos' or os.name == 'nt':
	SEPARATOR = ';'


如果我们调试一下会发现os.name的输出其实是既不是'dos', 也不是'nt', 而是'java'
再查看一下python的doc, http://docs.python.org/library/os.html, os.name的枚举值里的确有'java'.

这说明Python和Jython的实现肯定还是有差别的, 毕竟Jython是用纯java的实现的. 在java中可以用System.getProperty("os.name")取得系统类型. 不知道Jython为何将os.name设为'java'. 希望哪位python大牛给出jython的初衷.

找了一下os.environ中的键值对, 找到下面的方法可以在Jython中正确运行

# Sets the separator char for CLASSPATH
SEPARATOR = ';'
if not os.environ['OS'] == 'Windows_NT':
	SEPARATOR = ':'
分享到:
评论

相关推荐

    Python Cookbook, 2nd Edition

    Counting Pages of PDF Documents on Mac OS X Recipe 2.25. Changing File Attributes on Windows Recipe 2.26. Extracting Text from OpenOffice.org Documents Recipe 2.27. Extracting Text from ...

    python调用java.rar

    print(System.getProperty("os.name")) jpype.shutdownJVM() ``` 这段代码启动JVM,获取操作系统名称,并关闭JVM。 **2. Py4J**: `Py4J`则提供了一个更复杂的解决方案,它通过网关服务允许Python程序安全地访问...

    WAS自动部署技术总结

    <target name="deploy" if="os.name"> <!-- 特定于Windows的操作 --> ``` ##### 4. 邮件通知 通过`mail`任务发送构建状态的邮件通知。 ```xml <mail from="build@example....

    python基础教程至60课(基础)

    Python是一种广泛使用的高级编程语言,以其易读性、简洁的语法和强大的功能而闻名。作为初学者,了解Python的基础知识是...通过学习,你将能够编写出解决实际问题的Python程序,并为进一步学习高级主题打下坚实的基础。

    jna-4.2.2 官方原版下载

    What OS/CPU/architecture you're using (e.g. Windows 7 64-bit) Reference to your native interface definitions (i.e. C headers), if available The JNA mapping you're trying to use VM crash logs, if ...

    python图形用户界面.pdf

    - **wxPython**:基于wxWindows的GUI工具包,提供了一个强大的跨平台界面解决方案,支持Windows、Mac OS X和Linux等多个操作系统。 - **PythonWin**:专门为Windows设计的GUI库,适用于特定环境下的快速应用开发。 -...

    Developing Web Applications with Ant

    2. **灵活性**:除了内置的任务外,Ant还支持通过脚本语言(如Jython、NetRexx等)扩展任务功能,以及调用Java自定义任务。此外,它还允许通过`<exec>`任务调用操作系统命令或外部可执行文件,这为复杂构建场景提供...

    python_Code

    6. **标准库**:Python有一个庞大的标准库,包含了各种模块,如`os`用于操作系统交互,`sys`用于系统相关操作,`numpy`和`pandas`用于科学计算和数据分析,`requests`用于HTTP请求等。 7. **第三方库**:除了标准库...

    Python面试题汇总及答案详解

    3. **模块与包**:导入模块(import、from...import、import...as...)、创建模块和包、sys模块、os模块、math模块等。 4. **面向对象编程**:类的定义、对象的创建与实例化、封装(访问修饰符public、private、...

    PYTHON_GIS_SONG

    此外,Python还可以通过不同的实现形式支持多种环境,例如Cython支持C/C++,Jython支持Java环境,IronPython则用于.NET平台。 Python的强大之处还在于其可扩展性。它拥有一个庞大的标准库,以及许多第三方库,这些...

    经典Python面试题之Python基础篇.docx

    - **强大的社区支持**: 拥有庞大的开发者社区,遇到问题可以很容易找到解决方案或帮助。 - **跨平台性**: 可以在多种操作系统上运行,如 Windows、Linux 和 macOS。 #### 2. 通过什么途径学习Python? - **在线...

    python3_9_5_doc.zip

    - 错误和异常:了解常见错误类型,如 SyntaxError、NameError、TypeError 等,学会编写异常处理代码。 - 调试工具:pdb(Python Debugger)是内置的调试器,可以帮助定位和修复代码问题。 8. **性能和优化**: -...

    Teste

    6. **标准库与第三方库**:Python拥有丰富的标准库,如用于网络通信的`socket`,处理文件的`os`和`shutil`,以及数据分析的`pandas`等。此外,还有大量高质量的第三方库,如用于Web开发的`Django`和`Flask`,科学...

    01-Python基础语法v5.0(第1节 开发环境安装介绍)05-Python解释器的下载和安装.ev4.rar

    其他还有Jython(基于Java平台)和IronPython(针对.NET框架)等。 下载Python解释器,用户通常会访问Python官方网站(https://www.python.org/),在那里可以选择适合的操作系统(Windows、Mac OS、Linux等)和...

    py源文件 例子

    2. **导入模块**:Python的模块化设计允许开发者通过`import`语句引入其他功能模块,如`math`(数学运算)、`os`(操作系统接口)等。 3. **变量定义**:Python中,变量无需预声明,直接赋值即可创建。例如,`name ...

    py代码-python中获取python版本号,在python中获取python的版本号。

    print("操作系统: ", os_name) # 获取Python解释器的具体版本 interpreter_version = platform.python_version() print("Python解释器版本: ", interpreter_version) ``` `platform`模块提供了大量用于获取平台...

    Android 自动化测试框架

    MonkeyRunner的脚本使用Jython(Python的Java版本)编写,这可能对测试人员的学习成本较高。此外,使用ById、ByName或ByText等方式操控界面元素可能会导致执行速度较慢。MonkeyRunner可用于安装、卸载、启动Activity...

    经典python面试题

    - **社区活跃**:拥有庞大的开发者社区支持,遇到问题容易找到解决方案。 - **跨平台性**:Python可在多种操作系统上运行,便于移植。 #### 2. 通过什么途径学习的Python? - **在线课程**:如Coursera、edX等提供...

Global site tag (gtag.js) - Google Analytics