首页 文章 精选 留言 我的

精选列表

搜索[python],共10000篇文章
优秀的个人博客,低调大师

Appium Python API 汇总

网络搜集而来,留着备用,方便自己也方便他人。感谢总结的人! 1.contexts contexts(self): Returns the contexts within the current session. 返回当前会话中的上下文,使用后可以识别H5页面的控件 :Usage: driver.contexts 用法 driver.contexts 2. current_context current_context(self): Returns the current context of the current session. 返回当前会话的当前上下文 :Usage: driver.current_context 用法driver. current_context 3. context context(self): Returns the current context of the current session. 返回当前会话的当前上下文。 :Usage: driver.context 用法driver. Context 4. find_element_by_ios_uiautomation find_element_by_ios_uiautomation(self, uia_string): Finds an element by uiautomation in iOS. 通过iOS uiautomation查找元素 :Args: - uia_string - The element name in the iOS UIAutomation library :Usage: driver.find_element_by_ios_uiautomation('.elements()[1].cells()[2]') 用法dr. find_element_by_ios_uiautomation(‘elements’) 5. find_element_by_accessibility_id find_element_by_accessibility_id(self, id): Finds an element by accessibility id. 通过accessibility id查找元素 :Args: - id - a string corresponding to a recursive element search using the Id/Name that the native Accessibility options utilize :Usage: driver.find_element_by_accessibility_id() 用法driver.find_element_by_accessibility_id(‘id’) 6.scroll scroll(self, origin_el, destination_el): Scrolls from one element to another 从元素origin_el滚动至元素destination_el :Args: - originalEl - the element from which to being scrolling - destinationEl - the element to scroll to :Usage: driver.scroll(el1, el2) 用法 driver.scroll(el1,el2) 7. drag_and_drop drag_and_drop(self, origin_el, destination_el): Drag the origin element to the destination element 将元素origin_el拖到目标元素destination_el :Args: - originEl - the element to drag - destinationEl - the element to drag to 用法 driver.drag_and_drop(el1,el2) 8.tap tap(self, positions, duration=None): Taps on an particular place with up to five fingers, holding for a certain time 模拟手指点击(最多五个手指),可设置按住时间长度(毫秒) :Args: - positions - an array of tuples representing the x/y coordinates of the fingers to tap. Length can be up to five. - duration - (optional) length of time to tap, in ms :Usage: driver.tap([(100, 20), (100, 60), (100, 100)], 500) 用法 driver.tap([(x,y),(x1,y1)],500) 9. swipe swipe(self, start_x, start_y, end_x, end_y, duration=None): Swipe from one point to another point, for an optional duration. 从A点滑动至B点,滑动时间为毫秒 :Args: - start_x - x-coordinate at which to start - start_y - y-coordinate at which to start - end_x - x-coordinate at which to stop - end_y - y-coordinate at which to stop - duration - (optional) time to take the swipe, in ms. :Usage: driver.swipe(100, 100, 100, 400) 用法 driver.swipe(x1,y1,x2,y2,500) 10.flick flick(self, start_x, start_y, end_x, end_y): Flick from one point to another point. 按住A点后快速滑动至B点 :Args: - start_x - x-coordinate at which to start - start_y - y-coordinate at which to start - end_x - x-coordinate at which to stop - end_y - y-coordinate at which to stop :Usage: driver.flick(100, 100, 100, 400) 用法 driver.flick(x1,y1,x2,y2) 11.pinch pinch(self, element=None, percent=200, steps=50): Pinch on an element a certain amount 在元素上执行模拟双指捏(缩小操作) :Args: - element - the element to pinch - percent - (optional) amount to pinch. Defaults to 200% - steps - (optional) number of steps in the pinch action :Usage: driver.pinch(element) 用法 driver.pinch(element) 12.zoom zoom(self, element=None, percent=200, steps=50): Zooms in on an element a certain amount 在元素上执行放大操作 :Args: - element - the element to zoom - percent - (optional) amount to zoom. Defaults to 200% - steps - (optional) number of steps in the zoom action :Usage: driver.zoom(element) 用法 driver.zoom(element) 13.reset reset(self): Resets the current application on the device. 重置应用(类似删除应用数据) 用法 driver.reset() 14. hide_keyboard hide_keyboard(self, key_name=None, key=None, strategy=None): Hides the software keyboard on the device. In iOS, use `key_name` to press a particular key, or `strategy`. In Android, no parameters are used. 隐藏键盘,iOS使用key_name隐藏,安卓不使用参数 :Args: - key_name - key to press - strategy - strategy for closing the keyboard (e.g., `tapOutside`) driver.hide_keyboard() 15. keyevent keyevent(self, keycode, metastate=None): Sends a keycode to the device. Android only. Possible keycodes can be found in http://developer.android.com/reference/android/view/KeyEvent.html. 发送按键码(安卓仅有),按键码可以上网址中找到 :Args: - keycode - the keycode to be sent to the device - metastate - meta information about the keycode being sent 用法 dr.keyevent(‘4’) 16. press_keycode press_keycode(self, keycode, metastate=None): Sends a keycode to the device. Android only. Possible keycodes can be found in http://developer.android.com/reference/android/view/KeyEvent.html. 发送按键码(安卓仅有),按键码可以上网址中找到 :Args: - keycode - the keycode to be sent to the device - metastate - meta information about the keycode being sent 用法 driver.press_ keycode(‘4’) dr.keyevent(‘4’)与driver.press_ keycode(‘4’) 功能实现上一样的,都是按了返回键 17. long_press_keycode long_press_keycode(self, keycode, metastate=None): Sends a long press of keycode to the device. Android only. Possible keycodes can be found in http://developer.android.com/reference/android/view/KeyEvent.html. 发送一个长按的按键码(长按某键) :Args: - keycode - the keycode to be sent to the device - metastate - meta information about the keycode being sent 用法 driver.long_press_keycode(‘4’) 18.current_activity current_activity(self): Retrieves the current activity on the device. 获取当前的activity 用法 print(driver.current_activity()) 19. wait_activity wait_activity(self, activity, timeout, interval=1): Wait for an activity: block until target activity presents or time out. This is an Android-only method. 等待指定的activity出现直到超时,interval为扫描间隔1秒 即每隔几秒获取一次当前的activity 返回的True 或 False :Agrs: - activity - target activity - timeout - max wait time, in seconds - interval - sleep interval between retries, in seconds 用法driver.wait_activity(‘.activity.xxx’,5,2) 20. background_app background_app(self, seconds): Puts the application in the background on the device for a certain duration. 后台运行app多少秒 :Args: - seconds - the duration for the application to remain in the background 用法 driver.background_app(5) 置后台5秒后再运行 21.is_app_installed is_app_installed(self, bundle_id): Checks whether the application specified by `bundle_id` is installed on the device. 检查app是否有安装 返回 True or False :Args: - bundle_id - the id of the application to query 用法 driver.is_app_installed(“com.xxxx”) 22.install_app install_app(self, app_path): Install the application found at `app_path` on the device. 安装app,app_path为安装包路径 :Args: - app_path - the local or remote path to the application to install 用法 driver.install_app(app_path) 23.remove_app remove_app(self, app_id): Remove the specified application from the device. 删除app :Args: - app_id - the application id to be removed 用法 driver.remove_app(“com.xxx.”) 24.launch_app launch_app(self): Start on the device the application specified in the desired capabilities. 启动app 用法 driver.launch_app() 25.close_app close_app(self): Stop the running application, specified in the desired capabilities, on the device. 关闭app 用法 driver.close_app() 启动和关闭app运行好像会出错 26. start_activity start_activity(self, app_package, app_activity, **opts): Opens an arbitrary activity during a test. If the activity belongs to another application, that application is started and the activity is opened. This is an Android-only method. 在测试过程中打开任意活动。如果活动属于另一个应用程序,该应用程序的启动和活动被打开。 这是一个安卓的方法 :Args: - app_package - The package containing the activity to start. - app_activity - The activity to start. - app_wait_package - Begin automation after this package starts (optional). - app_wait_activity - Begin automation after this activity starts (optional). - intent_action - Intent to start (optional). - intent_category - Intent category to start (optional). - intent_flags - Flags to send to the intent (optional). - optional_intent_arguments - Optional arguments to the intent (optional). - stop_app_on_reset - Should the app be stopped on reset (optional)? 用法 driver.start_activity(app_package, app_activity) 27.lock lock(self, seconds): Lock the device for a certain period of time. iOS only. 锁屏一段时间 iOS专有 :Args: - the duration to lock the device, in seconds 用法 driver.lock() 28.shake shake(self): Shake the device. 摇一摇手机 用法 driver.shake() 29.open_notifications open_notifications(self): Open notification shade in Android (API Level 18 and above) 打系统通知栏(仅支持API 18 以上的安卓系统) 用法 driver.open_notifications() 30.network_connection network_connection(self): Returns an integer bitmask specifying the network connection type. Android only. 返回网络类型 数值 Possible values are available through the enumeration `appium.webdriver.ConnectionType` 用法 driver.network_connection 31. set_network_connection set_network_connection(self, connectionType): Sets the network connection type. Android only. Possible values: Value (Alias) | Data | Wifi | Airplane Mode ------------------------------------------------- 0 (None) | 0 | 0 | 0 1 (Airplane Mode) | 0 | 0 | 1 2 (Wifi only) | 0 | 1 | 0 4 (Data only) | 1 | 0 | 0 6 (All network on) | 1 | 1 | 0 These are available through the enumeration appium.webdriver.ConnectionType` 设置网络类型 :Args: - connectionType - a member of the enum appium.webdriver.ConnectionType 用法 先加载from appium.webdriver.connectiontype import ConnectionType dr.set_network_connection(ConnectionType.WIFI_ONLY) ConnectionType的类型有 NO_CONNECTION = 0 AIRPLANE_MODE = 1 WIFI_ONLY = 2 DATA_ONLY = 4 ALL_NETWORK_ON = 6 32. available_ime_engines available_ime_engines(self): Get the available input methods for an Android device. Package and activity are returned (e.g., ['com.android.inputmethod.latin/.LatinIME']) Android only. 返回安卓设备可用的输入法 用法print(driver.available_ime_engines) 33.is_ime_active is_ime_active(self): Checks whether the device has IME service active. Returns True/False. Android only. 检查设备是否有输入法服务活动。返回真/假。 安卓 用法 print(driver.is_ime_active()) 34.activate_ime_engine activate_ime_engine(self, engine): Activates the given IME engine on the device. Android only. 激活安卓设备中的指定输入法,设备可用输入法可以从“available_ime_engines”获取 :Args: - engine - the package and activity of the IME engine to activate (e.g., 'com.android.inputmethod.latin/.LatinIME') 用法 driver.activate_ime_engine(“com.android.inputmethod.latin/.LatinIME”) 35.deactivate_ime_engine deactivate_ime_engine(self): Deactivates the currently active IME engine on the device. Android only. 关闭安卓设备当前的输入法 用法 driver.deactivate_ime_engine() 36.active_ime_engine active_ime_engine(self): Returns the activity and package of the currently active IME engine (e.g., 'com.android.inputmethod.latin/.LatinIME'). Android only. 返回当前输入法的包名 用法 driver.active_ime_engine 37. toggle_location_services toggle_location_services(self): Toggle the location services on the device. Android only. 打开安卓设备上的位置定位设置 用法 driver.toggle_location_services() 38.set_location set_location(self, latitude, longitude, altitude): Set the location of the device 设置设备的经纬度 :Args: - latitude纬度 - String or numeric value between -90.0 and 90.00 - longitude经度 - String or numeric value between -180.0 and 180.0 - altitude海拔高度- String or numeric value 用法 driver.set_location(纬度,经度,高度) 39.tag_name tag_name(self): This element's ``tagName`` property. 返回元素的tagName属性 经实践返回的是class name 用法 element.tag_name() 40.text text(self): The text of the element. 返回元素的文本值 用法 element.text() 41.click click(self): Clicks the element. 点击元素 用法 element.click() 42.submit submit(self): Submits a form. 提交表单 用法 暂无 43.clear clear(self): Clears the text if it's a text entry element. 清除输入的内容 用法 element.clear() 44.get_attribute get_attribute(self, name): 详见@chenhengjie123的超级链接 Gets the given attribute or property of the element. 1、获取 content-desc 的方法为 get_attribute("name") ,而且还不能保证返回的一定是 content-desc (content-desc 为空时会返回 text 属性值) 2、get_attribute 方法不是我们在 uiautomatorviewer 看到的所有属性都能获取的(此处的名称均为使用 get_attribute 时使用的属性名称): 可获取的: 字符串类型: name(返回 content-desc 或 text) text(返回 text) className(返回 class,只有 API=>18 才能支持) resourceId(返回 resource-id,只有 API=>18 才能支持) This method will first try to return the value of a property with the given name. If a property with that name doesn't exist, it returns the value of the attribute with the same name. If there's no attribute with that name, ``None`` is returned. Values which are considered truthy, that is equals "true" or "false", are returned as booleans. All other non-``None`` values are returned as strings. For attributes or properties which do not exist, ``None`` is returned. :Args: - name - Name of the attribute/property to retrieve. Example:: # Check if the "active" CSS class is applied to an element. is_active = "active" in target_element.get_attribute("class") 用法 暂无 45.is_selected is_selected(self): Returns whether the element is selected. Can be used to check if a checkbox or radio button is selected. 返回元素是否选择。 可以用来检查一个复选框或单选按钮被选中。 用法 element.is_slected() 46.is_enabled is_enabled(self): Returns whether the element is enabled. 返回元素是否可用True of False 用法 element.is_enabled() 47.find_element_by_id find_element_by_id(self, id_): Finds element within this element's children by ID. 通过元素的ID定位元素 :Args: - id_ - ID of child element to locate. 用法 driver. find_element_by_id(“id”) 48. find_elements_by_id find_elements_by_id(self, id_): Finds a list of elements within this element's children by ID. 通过元素ID定位,含有该属性的所有元素 :Args: - id_ - Id of child element to find. 用法 driver. find_elements_by_id(“id”) 49. find_element_by_name find_element_by_name(self, name): Finds element within this element's children by name. 通过元素Name定位(元素的名称属性text) :Args: - name - name property of the element to find. 用法 driver.find_element_by_name(“name”) 50. find_elements_by_name find_elements_by_name(self, name): Finds a list of elements within this element's children by name. 通过元素Name定位(元素的名称属性text),含有该属性的所有元素 :Args: - name - name property to search for. 用法 driver.find_element_by_name(“name”) 51. find_element_by_link_text find_element_by_link_text(self, link_text): Finds element within this element's children by visible link text. 通过元素可见链接文本定位 :Args: - link_text - Link text string to search for. 用法 driver.find_element_by_link_text(“text”) 52. find_elements_by_link_text find_element_by_link_text(self, link_text): Finds a list of elements within this element's children by visible link text 通过元素可见链接文本定位,含有该属性的所有元素 :Args: - link_text - Link text string to search for. 用法 driver.find_elements_by_link_text(“text”) 53. find_element_by_partial_link_text find_element_by_partial_link_text(self, link_text): Finds element within this element's children by partially visible link text. 通过元素部分可见链接文本定位 :Args: - link_text - Link text string to search for. driver. find_element_by_partial_link_text(“text”) 54. find_elements_by_partial_link_text find_elements_by_partial_link_text(self, link_text): Finds a list of elements within this element's children by link text. 通过元素部分可见链接文本定位,含有该属性的所有元素 :Args: - link_text - Link text string to search for. driver. find_elements_by_partial_link_text(“text”) 55. find_element_by_tag_name find_element_by_tag_name(self, name): Finds element within this element's children by tag name. 通过查找html的标签名称定位元素 :Args: - name - name of html tag (eg: h1, a, span) 用法 driver.find_element_by_tag_name(“name”) 56. find_elements_by_tag_name find_elements_by_tag_name(self, name): Finds a list of elements within this element's children by tag name. 通过查找html的标签名称定位所有元素 :Args: - name - name of html tag (eg: h1, a, span) 用法driver.find_elements_by_tag_name(“name”) 57. find_element_by_xpath find_element_by_xpath(self, xpath): Finds element by xpath. 通过Xpath定位元素,详细方法可参阅http://www.w3school.com.cn/xpath/ :Args: xpath - xpath of element to locate. "//input[@class='myelement']" Note: The base path will be relative to this element's location. This will select the first link under this element. :: myelement.find_elements_by_xpath(".//a") However, this will select the first link on the page. :: myelement.find_elements_by_xpath("//a") 用法 find_element_by_xpath(“//*”) 58. find_elements_by_xpath find_elements_by_xpath(self, xpath): Finds elements within the element by xpath. :Args: - xpath - xpath locator string. Note: The base path will be relative to this element's location. This will select all links under this element. :: myelement.find_elements_by_xpath(".//a") However, this will select all links in the page itself. :: myelement.find_elements_by_xpath("//a") 用法find_elements_by_xpath(“//*”) 59. find_element_by_class_name find_element_by_class_name(self, name): Finds element within this element's children by class name. 通过元素class name属性定位元素 :Args: - name - class name to search for. 用法 driver. find_element_by_class_name(“android.widget.LinearLayout”) 60. find_elements_by_class_name find_elements_by_class_name(self, name): Finds a list of elements within this element's children by class name. 通过元素class name属性定位所有含有该属性的元素 :Args: - name - class name to search for. 用法 driver. find_elements_by_class_name(“android.widget.LinearLayout”) 61. find_element_by_css_selector find_element_by_css_selector(self, css_selector): Finds element within this element's children by CSS selector. 通过CSS选择器定位元素 :Args: - css_selector - CSS selctor string, ex: 'a.nav#home' 62.send_keys send_keys(self, *value): Simulates typing into the element. 在元素中模拟输入(开启appium自带的输入法并配置了appium输入法后,可以输入中英文) :Args: - value - A string for typing, or setting form fields. For setting file inputs, this could be a local file path. Use this to send simple key events or to fill out form fields:: form_textfield = driver.find_element_by_name('username') form_textfield.send_keys("admin") This can also be used to set file inputs. :: file_input = driver.find_element_by_name('profilePic') file_input.send_keys("path/to/profilepic.gif") # Generally it's better to wrap the file path in one of the methods # in os.path to return the actual path to support cross OS testing. # file_input.send_keys(os.path.abspath("path/to/profilepic.gif")) driver.element.send_keys(“中英”) 63. is_displayed is_displayed(self): Whether the element is visible to a user. 此元素用户是否可见。简单地说就是隐藏元素和被控件挡住无法操作的元素(仅限 Selenium,appium是否实现了类似功能不是太确定)这一项都会返回 False 用法 driver.element.is_displayed() 64. location_once_scrolled_into_view location_once_scrolled_into_view(self): """THIS PROPERTY MAY CHANGE WITHOUT WARNING. Use this to discover where on the screen an element is so that we can click it. This method should cause the element to be scrolled into view. Returns the top lefthand corner location on the screen, or ``None`` if the element is not visible. 暂不知道用法 """ 65.size size(self): The size of the element. 获取元素的大小(高和宽) new_size["height"] = size["height"] new_size["width"] = size["width"] 用法 driver.element.size 66. value_of_css_property value_of_css_property(self, property_name): The value of a CSS property. CSS属性 用法 暂不知 67.location location(self): The location of the element in the renderable canvas. 获取元素左上角的坐标 用法 driver.element.location '''返回element的x坐标, int类型''' driver.element.location.get('x') '''返回element的y坐标, int类型''' driver.element.location.get('y') 68.rect rect(self): A dictionary with the size and location of the element. 元素的大小和位置的字典 69. screenshot_as_base64 screenshot_as_base64(self): Gets the screenshot of the current element as a base64 encoded string. 获取当前元素的截图为Base64编码的字符串 :Usage: img_b64 = element.screenshot_as_base64 70.execute_script execute_script(self, script, *args): Synchronously Executes JavaScript in the current window/frame. 在当前窗口/框架(特指 Html 的 iframe )同步执行 javascript 代码。你可以理解为如果这段代码是睡眠5秒,这五秒内主线程的 javascript 不会执行 :Args: - script: The JavaScript to execute. - \*args: Any applicable arguments for your JavaScript. :Usage: driver.execute_script('document.title') 71.execute_async_script execute_async_script(self, script, *args): Asynchronously Executes JavaScript in the current window/frame. 插入 javascript 代码,只是这个是异步的,也就是如果你的代码是睡眠5秒,那么你只是自己在睡,页面的其他 javascript 代码还是照常执行 :Args: - script: The JavaScript to execute. - \*args: Any applicable arguments for your JavaScript. :Usage: driver.execute_async_script('document.title') 72.current_url current_url(self): Gets the URL of the current page. 获取当前页面的网址。 :Usage: driver.current_url 用法 driver.current_url 73. page_source page_source(self): Gets the source of the current page. 获取当前页面的源。 :Usage: driver.page_source 74.close close(self): Closes the current window. 关闭当前窗口 :Usage: driver.close() 75.quit quit(self): Quits the driver and closes every associated window. 退出脚本运行并关闭每个相关的窗口连接 :Usage: driver.quit() 本文转自 小强测试帮 51CTO博客,原文链接:http://blog.51cto.com/xqtesting/1894027,如需转载请自行联系原作者

优秀的个人博客,低调大师

python spark kmeans demo

官方的demo from numpy import array from math import sqrt from pyspark import SparkContext from pyspark.mllib.clustering import KMeans, KMeansModel sc = SparkContext(appName="clusteringExample") # Load and parse the data data = sc.textFile("/root/spark-2.1.1-bin-hadoop2.6/data/mllib/kmeans_data.txt") parsedData = data.map(lambda line: array([float(x) for x in line.split(' ')])) # Build the model (cluster the data) clusters = KMeans.train(parsedData, 2, maxIterations=10, initializationMode="random") # Evaluate clustering by computing Within Set Sum of Squared Errors def error(point): center = clusters.centers[clusters.predict(point)] return sqrt(sum([x**2 for x in (point - center)])) WSSSE = parsedData.map(lambda point: error(point)).reduce(lambda x, y: x + y) print("Within Set Sum of Squared Error = " + str(WSSSE)) # Save and load model #clusters.save(sc, "target/org/apache/spark/PythonKMeansExample/KMeansModel") #sameModel = KMeansModel.load(sc, "target/org/apache/spark/PythonKMeansExample/KMeansModel") 带归一化的例子: import org.apache.spark.mllib.linalg.Vectors import org.apache.spark.mllib.clustering.KMeans import org.apache.spark.mllib.regression.LabeledPoint import org.apache.spark.sql.functions.{col, udf} case class DataRow(label: Double, x1: Double, x2: Double) val data = sqlContext.createDataFrame(sc.parallelize(Seq( DataRow(3, 1, 2), DataRow(5, 3, 4), DataRow(7, 5, 6), DataRow(6, 0, 0) ))) val parsedData = data.rdd.map(s => Vectors.dense(s.getDouble(1),s.getDouble(2))).cache() val clusters = KMeans.train(parsedData, 3, 20) val t = udf { (x1: Double, x2: Double) => clusters.predict(Vectors.dense(x1, x2)) } val result = data.select(col("label"), t(col("x1"), col("x2"))) The important part are the last two lines. Creates a UDF (user-defined function) which can be directly applied to Dataframe columns (in this case, the two columns x1 and x2). Selects the label column along with the UDF applied to the x1 and x2 columns. Since the UDF will predict closestCluster, after this result will be a Dataframe consisting of (label, closestCluster) 参考:https://stackoverflow.com/questions/31447141/spark-mllib-kmeans-from-dataframe-and-back-again import org.apache.spark.mllib.linalg.Vectors import org.apache.spark.mllib.clustering._ val rows = data.rdd.map(r => (r.getDouble(1),r.getDouble(2))).cache() val vectors = rows.map(r => Vectors.dense(r._1, r._2)) val kMeansModel = KMeans.train(vectors, 3, 20) val predictions = rows.map{r => (r._1, kMeansModel.predict(Vectors.dense(r._1, r._2)))} val df = predictions.toDF("id", "cluster") df.show Create column from RDD It's very easy to obtain pairs of ids and clusters in form of RDD: val idPointRDD = data.rdd.map(s => (s.getInt(0), Vectors.dense(s.getDouble(1),s.getDouble(2)))).cache() val clusters = KMeans.train(idPointRDD.map(_._2), 3, 20) val clustersRDD = clusters.predict(idPointRDD.map(_._2)) val idClusterRDD = idPointRDD.map(_._1).zip(clustersRDD) Then you create DataFrame from that val idCluster = idClusterRDD.toDF("id", "cluster") It works because map doesn't change order of the data in RDD, which is why you can just zip ids with results of prediction. Use UDF (User Defined Function) Second method involves usingclusters.predictmethod as UDF: val bcClusters = sc.broadcast(clusters) def predict(x: Double, y: Double): Int = { bcClusters.value.predict(Vectors.dense(x, y)) } sqlContext.udf.register("predict", predict _) Now we can use it to add predictions to data: val idCluster = data.selectExpr("id", "predict(x, y) as cluster") Keep in mind that Spark API doesn't allow UDF deregistration. This means that closure data will be kept in the memory. 本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/bonelee/p/7229115.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

linux下安装python

Android服务被设计用来执行很多操作,比如说,可以执行运行时间长的耗时操作,比较耗时的网络操作,甚至是在一个单独进程中的永不会结束的操作。实现这些操作之一是通过Android接口定义语言(AIDL)来完成的。AIDL被设计用来执行进程间通信,另一种实现方式见博文Android进程间的通信之Messenger。本文我们将学习如何创建AIDL文件实现Android进程间通信。在正式学习之前,我们先澄清一些“事实”。 关于Android Service 1、Android服务不是后台任务,它们默认只运行在你的app的主线程中 2、Android服务可以通过设置来运行在不同进程中 3、如果Android服务在不同进程中启动,你将不能使用通常的IBinder接口与其通信 AIDL:Android Interface Definition Language 为了在Android应用中实现进程间通信,我们需要在远端进程中定义一系列可被当前进程访问的方法。通过AIDL我们可以定义这样的一系列方法。AIDL就好像Java中的其它接口一样可以在其中定义一些抽象方法。我们首先需要创建一个以.aidl为后缀的文件并在里面定义所需的抽象方法。 AIDL的一个主要特征是,通过使用AIDL,我们可以在两个不同的应用中进行通信(其实Messenger也可以实现同样的操作,两者区别请见博文Android进程间的通信之Messenger);当然,如果你的应用不需要跟另外一个应用进行通信,那就尽量避免使用AIDL机制吧。aidl文件中定义的抽象方法中,只有一些原始数据类型以及一些基本数据类型如String,lists,maps等可以作为这些方法的参数,如果你想使用一个自定义类作为参数,那么你的自定义类必须实现Parcelable接口,并且该类要被导入AIDL文件中,这一点应该在单独的课程中进行讲解。本文只学习简单的AIDL用法。 AIDL实现思路 AIDL通过定义服务端暴露的接口,以提供给客户端来调用,AIDL使服务端可以并行处理(因此你可能需要考虑多线程并发访问的线程安全性问题)。通过编写aidl文件来设计想要暴露的接口,编译后会自动生成相应的Java文件,服务端将接口的具体实现写入Stub中,通过IBinder对象传递给客户端,客户端bindService时,通过asInterface方法将IBinder还原成接口,供客户端调用其中的方法。 简单示例 AndroidManifest.xml <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme"> <activity android:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <actionandroid:name="android.intent.action.MAIN"/> <categoryandroid:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <serviceandroid:name=".BoundService"android:process=":custom_process"/> </application> IBoundService.aidl packageyf.exam.service.aidl; interfaceIBoundService{ intgetResult(inta,intb); } BoundService.java publicclassBoundServiceextendsService{ privateIBoundService.StubmBinder=newIBoundService.Stub(){ @Override publicintgetResult(inta,intb)throwsRemoteException{ returna+b; } }; @Override publicIBinderonBind(Intentintent){ returnmBinder; } } MainActivity.java publicclassMainActivityextendsActivity{ privateButtonbtn=null; privateIBoundServicemIBoundService; privatebooleanmServiceConnected=false; privateServiceConnectionconn=newServiceConnection(){ @Override publicvoidonServiceDisconnected(ComponentNamename){ mServiceConnected=false; } @Override publicvoidonServiceConnected(ComponentNamename,IBinderservice){ mIBoundService=IBoundService.Stub.asInterface(service); mServiceConnected=true; } }; @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn=(Button)findViewById(R.id.button1); Intentintent=newIntent(this,BoundService.class); bindService(intent,conn,Context.BIND_AUTO_CREATE); btn.setOnClickListener(newView.OnClickListener(){ @Override publicvoidonClick(Viewv){ if(mServiceConnected){ try{ intresult=mIBoundService.getResult(2,4); Toast.makeText(MainActivity.this,"result="+result, Toast.LENGTH_SHORT).show(); }catch(RemoteExceptione){ e.printStackTrace(); } } } }); } @Override protectedvoidonDestroy(){ super.onDestroy(); if(mServiceConnected){ unbindService(conn); mServiceConnected=false; } } } 本文转自 zddnd 51CTO博客,原文链接:http://blog.51cto.com/13013666/1939696

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册