和其他语言类似,Python程序可以使用Windows自带的命令行窗口通过命令来运行,但是这种方式对于较为复杂的程序工程来说,容易混淆相互之间的层级和交互文件。因此,在编写程序工程时,建议使用专用的集成开发环境PyCharm。
读者可以直接到PyCharm官网下载最新版,也可以使用笔者提供的安装包。在配套资源的somesofts子目录下找到安装包文件pycharm-community-2022.1.1.exe,该版本是目前主流版本,而且适用面广(支持Windows 7、Windows 10、Windows 11)。
直接双击它开始安装,安装过程比较简单。采用默认配置安装即可。如果想在桌面上生成PyCharm程序的快捷方式,可以在“安装选项”对话框上对“PyCharm Community Edition”前的复选框打勾,如图2-14所示。稍等片刻,安装完成,如图2-15所示。
图2-14
图2-15
最后单击“Finish”按钮,确认PyCharm安装完成。现在马上趁热打铁,创建一个简单的PyCharm项目并运行,从而测试PyCharm是否安装成功。
【例2.3】 第一个PyCharm项目
(1)单击桌面上新生成的
图标启动PyCharm,如果是第一次启动会出现Import PyCharm Settings对话框,意思是让我们导入PyCharm这个软件的配置,一般建议选择Do not import settings,即不导入配置,也就是由PyCharm自动指定即可。之后单击OK按钮,完成初始化设定。
(2)此时出现欢迎对话框,如图2-16所示。该对话框常用的按钮有两个,一个是New Project,用于创建新工程;另外一个是Open,用于打开一个已经存在的工程。而Get From VCS的意思是从版本控制工具VCS上面获取源码,这个初学者可以不用关注,一般企业里稍大的项目才会用到版本控制。
图2-16
(3)单击New Project按钮来创建新工程,此时出现New Project对话框,在该对话框最上方的Location旁输入新工程的存储路径,比如D:\ex\mycv\pythonProject,并勾选Inherit global site-packages复选框,其他保持默认即可,如图2-17所示。
图2-17
(4)单击Create按钮,PyCharm将创建一个简单的新项目,并生成一个main.py源码文件。这个文件里面已经有几行代码了,如下所示:
def print_hi(name): # Use a breakpoint in the code line below to debug your script. print(f'Hi, {name}') # Press Ctrl+F8 to toggle the breakpoint. # Press the green button in the gutter to run the script. if __name__ == '__main__': print_hi('PyCharm')
代码很简单,就是两个函数:一个是main主函数,里面调用了自定义函数print_hi;另外一个是名为print_hi的自定义打印函数,里面调用了库函数print来输出字符串。
(5)让我们马上来运行这个文件。单击菜单栏中的Run→Run...或直接按快捷键Ctrl+F5,或者在左边的Project视图中右击main.py文件名,在弹出的快捷菜单中选择Run 'main',还可以直接单击PyCharm右上角的三角箭头图标按钮,如图2-18所示。
图2-18
代码运行后,如果在下方输出窗口中出现“Hi, PyCharm”,就表示PyCharm工作正常。现在我们学会了怎么新建一个项目,下面打开一个已经存在的项目,以此来加深PyCharm的使用体会。
【例2.4】 打开现有项目
(1)把例2.3的项目文件夹pythonProject复制一份,然后粘贴到磁盘某个路径下。笔者这里是把项目文件夹pythonProject剪切到路径D:\ex\mycvNew\下。注意是剪切,如果不小心用了复制,那就把路径d:\ex\mycv\下的pythonProject目录删掉。笔者故意用了一个新路径,目的是演示使用PyCharm打开一个已经存在的项目。
(2)打开PyCharm,在Welcome to Charm对话框上单击Open按钮通过Open按钮可以打开一个文件或一个项目,这里准备打开一个已经存在的项目。然后在Open File or Project对话框上选择项目文件夹,如图2-19所示。
图2-19
接着单击OK按钮。此时会出现对话框,询问是否在当前窗口或新的窗口中打开项目,如图2-20所示。
图2-20
我们直接单击This Windows按钮即可。随后,PyCharm将加载项目pythonProject,并自动打开main.py文件。然而,此时直接运行项目会报错,提示找不到Python解释器。这是因为这个项目最初是在d:\ex\mycv\下创建的,所以使用的Pythone解释器的路径是:
d:\ex\mycv\pythonProject\venv\Scripts\
由于d:\ex\mycv\下的pythonProject目录被删除了,而且项目文件夹移动到D:\ex\mycvNew\下,PyCharm依旧去d:\ex\mycv\pythonProject\venv\Scripts\下找解释器,当然找不到了。那怎么办呢?当然是要重新为项目配置解释器。
(3)开始配置解释器。在PyCharm中,单击菜单File→Setting,打开Settings窗口,然后在Settings窗口的左边单击Project:pythonProject,并选择Python Interpreter,此时可以看到右边Python Interpreter旁出现“[Invalid] Python 3.8(pythonProject)....”这样的提示,意思就是d:\ex\mycv\pythonProject\venv\Scripts\python.exe这个解释器已经无效了,如图2-21所示。
图2-21
现在单击Python Interpreter右方的下拉箭头,在下拉菜单中选择Show All...,此时出现Python Interpreters对话框。在该对话框中,选中那个无效的解释器,如图2-22所示。
图2-22
然后单击左上角的“-”图标或者直接按快捷键Alt+Delete来删除这个无效的解释器。删除后,再单击左上角的“+”图标或者直接按快捷键Alt+Insert来准备新增解释器,此时会出现Add Python Interpreters对话框。在该对话框中,一般会自动探测到新项目文件夹中解释器路径,并显示在Existing environment中,如图2-23所示。
直接单击OK按钮,回到Python Interpreters对话框,再单击该对话框上的OK按钮。此时我们在Settings对话框上可以看到Python解释器被成功添加了,如图2-24所示。
单击OK按钮关闭Settings对话框。然后在PyCharm中运行该项目,如果出现Edit Configuration对话框,则只需在Python Interpreter下拉菜单中选择刚刚添加的解释器即可,如图2-25所示。
图2-23
图2-24
图2-25
随后可以正确运行新工程,运行结果如下:
Hi, PyCharm
在图2-17中,在New environment using旁有个默认选项Viutualenv,这是什么意思呢?从字面意思看就是“新环境使用虚拟环境”。什么意思呢?
应用程序有时需要某个特定版本的库,因为它需要一个特定的bug已得到修复的库,或者它是使用一个过时版本的库的接口编写的。这就意味着无法通过一个Python来满足每个应用程序的要求。例如,应用程序A需要一个特定模块的1.0版本,但是应用程序B需要该模块的2.0版本,这两个应用程序的要求是冲突的,安装版本1.0或者版本2.0将会导致其中一个应用程序不能运行。
这个问题的解决方案就是为不同的应用各自创建一个虚拟环境(通常简称为virtualenv),包含一个特定版本的Python,以及一些附加包的独立的目录树。
应用程序A可以有自己的虚拟环境,其中安装了特定模块的1.0版本。而应用程序B拥有另外一个安装了特定模块2.0版本的虚拟环境。当应用程序B需要一个库升级到3.0版本时,也不会影响到应用程序A的环境。
如果直接在PyCharm中创建一个项目而不创建虚拟环境,那么安装的第三方包都会安装到系统Python解释器的site-packages文件夹下,比如:
C:\Users\Administrator\AppData\Local\Programs\Python\Python38\Lib\site-pac kages\
创建越多的项目,安装的库就越多。当我们新建一个项目时,必定会把site-packages下的所有库都导进来,而一些库这个项目根本就不需要,但是又不能删除(因为别的项目在用),这时就需要虚拟环境了。如果只创建一两个项目用于Python入门,那么用不用虚拟环境都不影响。了解了虚拟环境的背景知识,我们再来看一下Creat Project对话框,如图2-26所示。
图2-26
New environment using下拉菜单中有4个选项,其中3个是虚拟环境,分别是Virtualenv、Pipenv和Conda,如图2-27所示。下面简要介绍一下前面两种。
Virtualenv是本书默认使用的虚拟环境方式。通过Virtualenv创建的虚拟目录放在本项目下的venv文件夹中。比如,假设项目地址是E:\PycharmProjects\pythonProject,则虚拟环境的地址就是E:\PycharmProjects\pythonProject\venv,虚拟环境中库的地址就是E:\PycharmProjects\pythonProject\venv\Lib\site-packages。
图2-27
Base Interpreter(基本解释器)就是系统Python解释器,也就是我们前面安装的Python软件,并配置好了环境变量。一般系统Python解释器的第三方库都在site-packages目录下,比如笔者的:
C:\Users\Administrator\AppData\Local\Programs\Python\Python38\Lib\site-pac kages\
Virtualenv一般配合requirements.txt文件对项目的依赖库进行管理。requirements.txt文件记录了本虚拟环境下的依赖库及其版本号,其生成方式如下:
打开Pycharm,按照例2.3的方式新建一个项目,然后单击菜单Tools→Sync Python Requirements,此时出现Sync Python requirements对话框,如图2-28所示。
图2-28
直接单击OK按钮,根目录下自动生成一个空的requirements.txt文件。此时打开PyCharm左下角的Terminal(终端),在终端窗口的命令行旁输入如下命令后按回车键:
pip freeze > requirements.txt
此时requirements.txt中生成的内容如下:
contourpy==1.1.1 cycler==0.12.1 fonttools==4.53.0 importlib-resources==6.4.0 kiwisolver==1.4.5 matplotlib==3.7.5 numpy==1.24.4 opencv-python==4.10.0.84 packaging==24.1 pillow==10.3.0 pyparsing==3.1.2 python-dateutil==2.9.0.post0 six==1.16.0 zipp==3.19.2
这样的结构让人一目了然,且方便项目移植。当复制一个含有requirements.txt文件的项目时,可以在终端窗口中输入以下命令来安装所有的依赖库:
pip install -r requirements.txt
Pipenv是一种工具,提供了为Python项目创建虚拟环境所需的所有必要方法。在安装或卸载软件包时,它会通过Pipfile文件自动管理项目软件包。
Pipenv还会生成Pipfile.lock文件,该文件用于生成确定性构建并创建工作环境的快照。当项目要求和软件包版本很重要时,这对于安全敏感型的应用部署特别有用。
如果当前版本的Pycharm没有内置Pipenv,则需要安装。安装步骤如下:
单击开始菜单,输入cmd,打开命令行窗口,运行以下命令以确保系统中已安装pip:
pip --version
pipenv通过运行以下命令进行安装:
pip install --user pipenv -i https://pypi.tuna.tsinghua.edu.cn/simple
安装成功后可以查看pipenv.exe所在路径。在命令行窗口输入以下命令:
py -m site --user-site
返回的是库路径,比如:
C:\Users\Administrator\AppData\Roaming\Python\Python38\site-packages
将此路径最后的site-packages替换为Scripts,则变成:
C:\Users\Administrator\AppData\Roaming\Python\Python38\Scripts
这个路径就是pipenv.exe所在的目录。
通过Pipenv创建的项目,其虚拟环境并不在本项目的目录下,而是在“C:\Users\当前用户名\.virtualenvs”文件夹下。在Pipenv虚拟环境中不用requirements.txt,Pipfile是Pipenv虚拟环境用于管理项目依赖项的专用文件,该文件对于使用Pipenv是必不可少的。当为新项目或现有项目创建Pipenv环境时,会自动生成Pipfile。
前面PyCharm开发的程序都是纯Python程序,并没有涉及OpenCV的代码。现在我们要在PyCharm下开发OpenCV代码。由于我们已经正确安装了Matplotlib、NumPy、opencv-python等开发包,因此,只要PyCharm能正确找到Python解释器,那么位于路径C:\Users\Administrator\AppData\Local\Programs\Python\Python38\Lib\site-packages\下的库就都可以被找到,则该路径下的cv2目录也可以被PyCharm感知,这样调用OpenCV库中的函数就不会报错了。如果把cv2改个名称,PyCharm也能马上感知到,并报错,无法运行OpenCV相关代码。
【例2.5】 第一个PyCharm下的OpenCV程序
(1)打开PyCharm,新建一个项目,项目目录是D:\ex\mycv\,项目名称保持默认pythonProject。注意,不要忘记勾选Inherit global site-packages复选框,以后示例中新建项目时都要勾选它,但不再提醒。
(2)在main.py中输入如下代码:
import cv2 as cv if __name__ == '__main__': # 读取图像,支持 bmp、jpg、png、tiff等常用格式 img = cv.imread("tree.png") cv.imshow("Hello,tree", img) # 显示窗口 cv.waitKey(0) # 等待按键 cv.destroyAllWindows()# 释放窗口
这些代码和例2.1中的代码几乎一样。注意把图片文件tree.png放到项目文件夹pythonProject下。
(3)按快捷键Ctrl+Shift+F10运行代码,运行结果如图2-29所示。
图2-29
是不是感觉很简单。其实,只需通过pip正确安装好OpenCV,也就是site-packages目录下存在cv2目录即可。不信的话,可以把cv2改个名称再运行本示例,马上报错!
和开发其他程序一样,Python程序有时也需要调试,比如设置断点、运行到断点处、单步执行、监视某个变量等。
在PyCharm中单步调试Python程序非常简单,只需设置好断点,然后按快捷键Shift+F9开始调试运行,就会执行到断点处,然后按快捷键Shift+F8开始单步执行(按快捷键Shift+F7也可以单步执行,并且遇到函数还能进入函数里面执行),如图2-30所示。
图2-30
在窗口下方的Debug视图中,我们直接可以看到变量a的相关信息。通常,设置断点、单步执行、监视变量这三大手段对于调试基本够用了。
另外,在运行程序时,如果出现了语法错误,可以到PyCharm下方的“运行”窗口中查看错误说明,如图2-31所示。
图2-31中显示,第6行(line 6)出错了。如果我们需要定位这一行,可以单击错误提示信息中带下画线的部分,编辑器即可跳转到相应的行。
图2-31