是否有针对IronPython的unicodedata模块?

时间:2011-04-26 02:04:25

标签: unicode module ironpython selenium-webdriver

我正在尝试使用IronPython获取selenium2 Sauce OnDemand服务的通用示例代码,用于我正在进行的一些测试工作,而且我遇到了一个我无法弄清楚的问题。

首先,这是环境:

Windows 7 Home Premium,64位。
IronPython 2.7.0.40 on .Net 4.0.30319.225

我的路径:

>>> sys.path
['.', 'C:\\users\\me\\scripts\\python', 'C:\\Program Files (x86)\\Microsoft Visual Studio 10.0\\Common7\\IDE\\Extensions\\Microsoft\\IronStudio\\0.4\\Lib', 'C:\\Program Files (x86)\\Microsoft Visual Studio 10.0\\Common7\\IDE\\Extensions\\Microsoft\\IronStudio\\0.4\\DLLs', 'C:\\opt\\win\\ipy\\Lib', 'C:\\opt\\win\\ipy\\DLLs', 'C:\\opt\\win\\ipy']  

我知道IronPython在使用压缩蛋时遇到了问题,因此我将以下库提取到sys.path中的\ Lib目录中:

(2.0b4dev)
rdflib (3.1.0)

现在,来自Sauce Labs的示例代码:

import unittest
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

class Selenium2OnSauce(unittest.TestCase):

    def setUp(self):
        desired_capabilities = dict(platform="WINDOWS",
                                    browserName="firefox",
                                    version="3.6", 
                                    name="Hello, Selenium 2!")
        self.driver = webdriver.Remote(
            desired_capabilities=desired_capabilities,
            command_executor="http://me:my-site-access-key@ondemand.saucelabs.com:80/wd/hub")

    def test_sauce(self):
        self.driver.get('http://example.saucelabs.com')
        assert "Sauce Labs" in self.driver.title

    def tearDown(self):
        self.driver.quit()

if __name__ == '__main__':
    unittest.main()

这是我得到的错误:

Traceback (most recent call last):
File "selenium2_test.py", line 3, in <module>
File "c:\opt\win\ipy\Lib\selenium\webdriver\__init__.py", line 18, in <module>
File "c:\opt\win\ipy\Lib\selenium\webdriver\firefox\webdriver.py", line 24, in <module>
File "c:\opt\win\ipy\Lib\selenium\webdriver\firefox\firefox_profile.py", line 23, in <module>
File "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\Extensions\Microsoft\IronStudio\0.4\Lib\rdflib\__init__.py", line 65, in <module>
File "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\Extensions\Microsoft\IronStudio\0.4\Lib\rdflib\namespace.py", line 282, in <module>
ImportError: No module named unicodedata

我已经尝试在其中搜索包含unicodedata的软件包(例如FePY),但它们似乎都不起作用。我试过从我的Python27安装中复制.pyd,但这也不起作用。

这是IronPython 2.7中尚未提供的内容吗?或者,是否有可以引用的库或命名空间来完成相同的任务?

如果没有,我想我不得不离开selenium2,直到Iron家伙获得IP27的unicoded。 :(

谢谢,
格雷格。

2 个答案:

答案 0 :(得分:2)

唉,unicodedata模块目前不包含在IronPython中。但不要害怕!对于即将发布的2.7.1版本将会有它,你的所有麻烦都将不复存在。

很抱歉。至于2.7.1何时发布,我想6月初。您可以检查https://github.com/IronLanguages/main/commit/5395af28b5794b0acf982ab87d17466925ab819f是否有补丁,但由于包含的Unicode数据库,它相当大而且繁琐。

答案 1 :(得分:0)

请参阅@Micheal Greene对原始问题的评论。以下是按指示编辑的模块:

# Copyright (c) 2006 by Seo Sanghyeon
# 2006-07-13 sanxiyn Created
# 2006-07-19 sanxiyn Added unidata_version, normalize
# Modified 2011 - Greg Gauthier - To provide needed functionality for rdflib
#                                 and other utilities, in IronPython 2.7.0

unidata_version = '3.2.0'

# --------------------------------------------------------------------
# Normalization

from System import String
from System.Text import NormalizationForm

def normalize(form, string):
    return String.Normalize(string, _form_mapping[form])

_form_mapping = {
    'NFC': NormalizationForm.FormC,
    'NFKC': NormalizationForm.FormKC,
    'NFD': NormalizationForm.FormD,
    'NFKD': NormalizationForm.FormKD,
}

# --------------------------------------------------------------------
# Character properties

from System.Globalization import CharUnicodeInfo

def _handle_default(function):
    def wrapper(unichr, default=None):
        result = function(unichr)
        if result != -1:
            return result
        if default is None:
            raise ValueError()
        return default
    return wrapper

decimal = _handle_default(CharUnicodeInfo.GetDecimalDigitValue)
digit = _handle_default(CharUnicodeInfo.GetDigitValue)
numeric = _handle_default(CharUnicodeInfo.GetNumericValue)

def category(unichr):
    uc = CharUnicodeInfo.GetUnicodeCategory(unichr)
    return _category_mapping[int(uc)]

_category_mapping = {
    0: 'Lu',
    1: 'Ll',
    2: 'Lt',
    3: 'Lm',
    4: 'Lo',
    5: 'Mn',
    6: 'Mc',
    7: 'Me',
    8: 'Nd',
    9: 'Nl',
    10: 'No',
    11: 'Zs',
    12: 'Zl',
    13: 'Zp',
    14: 'Cc',
    15: 'Cf',
    16: 'Cs',
    17: 'Co',
    18: 'Pc',
    19: 'Pd',
    20: 'Ps',
    21: 'Pe',
    22: 'Pi',
    23: 'Pf',
    24: 'Po',
    25: 'Sm',
    26: 'Sc',
    27: 'Sk',
    28: 'So',
    29: 'Cn',
}

# added for rdflib/ironpython
def decomposition(unichr): 
    return String.Normalize(unichr.ToString(), NormalizationForm.FormD)