Mac环境安装Python3

安装Python3
1、查看 mac 自带系统版本
#查看系统自带的python
open /System/Library/Frameworks/Python.framework/Versions
#系统当前的python版本。
python -V

2、开始安装(这里我们使用神器homebrew)
#安装前先搜索一下是否已经存在python3的包:
brew search python3
#已经存在,我们可以直接安装了:
brew install python3
#出现如下报错
Error: An unexpected error occurred during the `brew link` step
The formula built, but is not symlinked into /usr/local
Permission denied @ dir_s_mkdir – /usr/local/Frameworks
Error: Permission denied @ dir_s_mkdir – /usr/local/Frameworks
#手动创建一个这个目录
sudo mkdir /usr/local/Frameworks
#再来解决权限问题:
sudo chown $(whoami):admin /usr/local/Frameworks
#手动执行一下安装时未完成的创建连接:
brew link python3
#当前系统下的python3的信息:
brew info python3

#系统当前的python版本。
python -V

修改默认版本
#查找python3安装路径
brew info python3
#修改 Mac 系统配置文件
vi ~/.bash_profile
#添加配置信息
alias python=”/usr/local/bin/python3″
#编译系统配置文件
source ~/.bash_profile
#系统当前的python版本。
python -V

Python3 官方地址

如何在 Python3 中对列表 通过比较排序(不懂就问)?

已知列表和字典,列表是需排序元素,字典指明了元素间的优先关系,譬如 S1 需在 S3 之前,而 S3 又在 S2 之前。

s = [‘S1′,’S2′,’S3’]

val = {(‘S1′,’S3’):1,(‘S3′,’S2’):1}
希望得到的结果是[‘S1′,’S3′,’S2′],请问有何好的实现方式?

自己想用 python 中的 sort 的 cmp 参数进行排序,结果竟然没排序,不知原因。

from functools import cmp_to_key

s.sort(key=cmp_to_key(lambda x,y: val.get((x,y),0)))
s3′ Python s1’ s2’11 条回复 • 2021-09-02 16:34:53 +08:00
toaruScar 1
toaruScar 5 小时 38 分钟前
可以弄成一个 class,然后用 functools.total_ordering 自定义对比函数。
MoYi123 2
MoYi123 5 小时 34 分钟前
s = [‘S1’, ‘S2’, ‘S3’]
val = {(‘S1’, ‘S3’): 1, (‘S3’, ‘S2’): 1}

class S(str):

____def __lt__(self, other):
________if (self, other) in val:
____________return val[(self, other)] == 1
________return False

s = [S(i) for i in s]
s.sort()
print([str(i) for i in s])

能用, 但是应该有更好的办法
Trim21 3
Trim21 5 小时 33 分钟前 via Android ❤️ 1
key=lambda x: {s1: 1 , s3: 2, s3: 3}.get(x, 0)
lonelinsky 4
lonelinsky 4 小时 59 分钟前
s = [‘S1′,’S2′,’S3’]
val = {(‘S1′,’S3’):-1,(‘S3′,’S2’):-1} # 这里你一开始的定义有点问题,如果你希望 S1 排在 S3 前面,则它的值应该是负的

s.sort(key=cmp_to_key(lambda x,y: val.get((x,y), -val.get((y,x), 0)))) # 这里你可能需要同时处理 (y, x) 的情况,如果你的定义是对称的。即 S1 在 S3 前面 <=> S3 在 S2 后面

注意你现在的方式里面对于未出现 val 里面的对,都会当成不需要排序的对象。如果你是像解决 AOE 网络的拓扑排序问题,建议直接看相关算法。

=============================
你一开始的排序完全没用是因为排序时候,假设按序比较
(S1, S2) 你的 val 里面没有,返回 0 表示相等,不用做任何操作
(S2, S3) 你的 val 里面还是没有,返回 0 表示相等,又不用做任何操作,所以它已经排好序了
lonelinsky 5
lonelinsky 4 小时 51 分钟前
typo
S1 在 S3 前面 <=> S3 在 S1 后面
superhxl 6
superhxl 4 小时 30 分钟前
@lonelinsky 我的定义没问题,也许有更好的方式。本身问题背景是若干个点,一次对这些点遍历,想要打印遍历的顺序。字典中的值表示相继访问的顺序,访问 S1 后访问 S3,访问 S3 后访问 S2.

关于 cmp 的应用再查查文档,这个确实是临时搜索的解决方案。

目前可以通过冒泡排序解决,但我想应该有更好办法。
“`python
for p in range(len(s)-1):
for q in range(p + 1, len(s)):
if sol[z[(s[q],s[p])]] == 1:
s[p], s[q] = s[q], s[p]
“`
@toaruScar 去学习一下具体用法。
@MoYi123 好复杂的样子。
@Trim21 没看懂。
lonelinsky 7
lonelinsky 3 小时 29 分钟前
https://docs.python.org/3/library/functools.html#functools.cmp_to_key
A comparison function is any callable that accept two arguments, compares them, and returns a negative number for less-than, zero for equality, or a positive number for greater-than.

你定义的 1 会被认为是 greater-than,而默认排序是从小到大,所以你的定义和你的预期是反的,这是我说你定义有问题的地方,如果执意用 1 做定义的话,可以在 function 里面取个反就行。
你现在的定义里面不能保证任意两个元素的 cmp 结果都包含,比如你开始的定义里面 S1 和 S2 的大小关系没有显式定义,在冒泡这种会完全比较的排序方法中可能没问题,但是对于类似快排这种,排序中间可能会出现错误的结果。(这个地方是直觉,没有严格证明)

> 本身问题背景是若干个点,一次对这些点遍历,想要打印遍历的顺序。
如果是这个问题的话,建议用 OrderedDict https://docs.python.org/3/library/collections.html#collections.OrderedDict,直接打印就好了。
lonelinsky 8
lonelinsky 3 小时 25 分钟前
> 字典中的值表示相继访问的顺序
我好像理解错了,所以字典中的值会是 1,2,3 这样?是的话对字典按 value 排序,然后对 key 做个 reduce 就好了?
BBrother 9
BBrother 3 小时 24 分钟前
没看到你的问题,你是不是需要拓扑排序?
princelai 10
princelai 55 分钟前 ❤️ 2
from networkx import DiGraph, draw_networkx, topological_sort

s = [‘S1’, ‘S2’, ‘S3’, ‘S4’, ‘S5’]
val = {(‘S1’, ‘S3’): 1, (‘S3’, ‘S2’): 1, (‘S5’, ‘S1’): 1, (‘S2’, ‘S4’): 1}
g = DiGraph()
g.add_edges_from(val.keys())
s = list(topological_sort(g))
ipwx 11
ipwx 41 分钟前
@superhxl python 默认的不是两两比较排序,而是快速排序,只比 N log N 次。

所以你期待的 S1 < S3 + S3 < S2 imply S1 < S2 不存在。

你这个需求可以建图然后用拓扑排序。

Appium+Python3+iOS真机环境搭建

Appium 是一个自动化测试开源工具,支持 iOS 平台和 Android 平台上的原生应用,web 应用和混合应用。
1.环境配置
Mac系统自带的Python版本是2.7,当前要用新版,这里我选择的Python版本是3.5。下载安装。
删除掉mac自带的python2.7
sudo rm -R /System/Library/Frameworks/Python.framework/Versions/2.7
加上:
alias python=’/Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5’
保存退出,执行:
source ~/.bash_profile
2,把appium和selenium安装到python3.5的set-packages中
3,appium运行时jdk的安装
访问Oracle官网 http://www.oracle.com
jdk下载的地方https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html
下载安装jdk,打开Finder,可以在下图所示的路径中找到安装好的jdk 1.8.0_40.jdk
%title插图%num

Contents下的Home文件夹,是该JDK的根目录

%title插图%num

打开终端配置jdk环境变量:
如果你是*次配置环境变量,可以使用“touch .bash_profile” 创建一个.bash_profile的隐藏配置文件(如果你是为编辑已存在的配置文件,则使用”open -e .bash_profile”命令):
输入如下配置:

%title插图%num

JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home
PATH=$ JAVA_HOME/bin:$ PATH:.
CLASSPATH=$ JAVA_HOME/lib/tools.jar:$ JAVA_HOME/lib/dt.jar:.
export JAVA_HOME
export PATH
export CLASSPATH
然后保存关闭该窗口。
使用”source .bash_profile”使配置生效
输入 echo $ JAVA_HOME 显示刚才配置的路径
测试输入java -version
4,sdk环境变量的配置
在命令行输入 open -e .bash_profile , 打开.bash_profile文件,输入如下配置:
export ANDROID_HOME=/Library/Java/sdk
export PATH=$ {PATH}: $ {ANDROID_HOME}/tools
export PATH=$ {PATH}: $ {ANDROID_HOME}/platform-tools
export PATH=$ {PATH}: $ {ANDROID_HOME}/build-tools

export PATH=${PATH}:/Library/Java/sdk/platform-tools:/Library/Java/sdk/tools
%title插图%num

然后保存并关闭。
在命令行输入source .bash_profile ,使之生效。
5,ios的元素定位工具
a.Appium自带的Inspector工具
b.Macaca的app-inspector工具,具体地址:https://macacajs.github.io/app-inspector/cn/
c.Xcode自带的accessibility-inspector工具
具体地址:http://blog.csdn.net/icetime17/article/details/42211915
d.Appium团队提供的appium-ios-inspector
具体地址:https://github.com/mykola-mokhnach/Appium-iOS-Inspector
e.通过flex插件,具体地址:https://github.com/Flipboard/FLEX