解锁MacOS开发:环境配置与应用开发全攻略

✨✨ ✨这里是小韩学长 yyds 的BLOG ( 喜欢作者的点个关注吧 )

✨✨✨想要了解更多内容可以访问我的主页 小韩学长yyds-CSDN博客

目录

引言

[一、MacOS 开发环境配置](#一、MacOS 开发环境配置)

(一)必备工具安装

(二)集成开发环境(IDE)选择与安装

(三)系统设置优化

[二、MacOS 应用开发流程](#二、MacOS 应用开发流程)

(一)需求分析与设计

(二)代码编写

(三)测试环节

(四)部署与发布

三、常见问题及解决方案

(一)依赖库安装失败

(二)编译错误

[(三)Xcode 相关问题](#(三)Xcode 相关问题)

[四、实战案例:开发一个简单 MacOS 应用](#四、实战案例:开发一个简单 MacOS 应用)

(一)创建项目

(二)设计用户界面

(三)编写代码

(四)测试应用

(五)打包与发布


引言

在软件开发的广阔领域中,MacOS 凭借其独特的优势,成为众多开发者的首选平台。它基于 Unix 架构,拥有出色的稳定性与强大的命令行工具,让开发者能够轻松驾驭各种复杂的开发任务,无需担忧系统崩溃或数据丢失等问题 ,在处理大型项目和数据密集型任务时游刃有余。

MacOS 对多种编程语言和开发工具提供了良好的兼容性,无论是热门的 Python、Java,还是苹果官方大力推广用于开发 iOS 和 Mac 应用的 Swift 语言,都能在 MacOS 上找到适宜的开发环境。像 Xcode 这样强大的官方集成开发环境(IDE),为开发者提供了代码编辑、调试、版本控制等全方位的功能,助力应用开发更加高效流畅。同时,MacOS 还支持诸如 Visual Studio Code、Sublime Text 等主流代码编辑器,满足不同开发者的个性化需求。

此外,MacOS 与苹果的硬件设备,如 iPhone、iPad 等实现了无缝集成,为开发多平台应用提供了得天独厚的便利条件。其简洁直观、美观优雅的用户界面,不仅能让开发者在长时间的编码工作中保持舒适,更能有效提升开发效率,让开发者可以将更多的精力聚焦于代码本身。

看到这里,你是不是已经迫不及待想要在 MacOS 上搭建自己的开发环境,开启应用开发之旅了呢?接下来,本文将详细地为你介绍 MacOS 开发环境的配置步骤以及应用开发的相关流程,帮助你快速上手,在 MacOS 平台上释放自己的开发潜能。

一、MacOS 开发环境配置

(一)必备工具安装

  1. Command Line Tools:这是 MacOS 上开发的基础工具集,包含编译器、调试器等开发所需的命令行工具。打开终端,输入命令xcode-select --install,按提示操作即可完成安装。安装完成后,你就可以在终端中使用诸如gcc(GNU 编译器集合)、make(构建自动化工具)等命令,方便进行各种开发任务,比如编译 C、C++ 程序。
  1. Homebrew :作为 MacOS 上最受欢迎的包管理工具,Homebrew 能够帮助你轻松安装各种开发工具和库。在终端中输入/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)",等待安装完成。安装完成后,可以通过brew doctor检查安装状态,使用brew install <package-name>命令安装软件包,例如brew install node来安装 Node.js。有了 Homebrew,你无需再手动从官网下载、解压、配置各种软件,大大提高了开发效率。
  1. Git:这是一个分布式版本控制系统,常用于追踪代码历史和协作开发。可以使用 Homebrew 来安装,在终端输入brew install git。安装完成后,通过git --version命令检查是否安装成功。Git 能够让你方便地管理代码版本,与团队成员协作开发时,可以轻松拉取、推送代码,还能查看代码的修改历史,对于多人协作开发和个人项目管理都非常重要。例如,在开发一个大型项目时,团队成员可以各自在本地进行代码修改,然后通过 Git 将修改同步到远程仓库,方便又高效。

(二)集成开发环境(IDE)选择与安装

  1. Xcode:这是苹果官方的集成开发环境,主要用于开发 macOS、iOS、watchOS 和 tvOS 应用。它集成了代码编辑器、调试器、模拟器等一系列强大的工具,并且对 Swift 和 Objective - C 等编程语言提供了出色的支持。在 App Store 中搜索 "Xcode",找到后点击 "获取" 然后是 "安装" 按钮。若提示,输入你的 Apple ID 信息以进行下载。下载完成后,打开安装程序并按照提示完成安装。初次运行时,可能会要求你同意 Xcode 许可协议,需要阅读并同意才能继续。Xcode 自带的 Interface Builder 工具,让开发者可以通过可视化的方式快速搭建应用界面,大大缩短了开发周期 。
  1. 其他 IDE 推荐
  • Visual Studio Code:这是一个轻量级但功能强大的源代码编辑器,支持多种编程语言,如 JavaScript、TypeScript、Python 等。它具有丰富的扩展程序市场,开发者可以根据自己的需求安装各种插件来扩展功能。比如安装 Python 插件后,就可以获得代码补全、调试支持等功能,非常适合小型项目、快速编辑文件以及多种开发场景。使用 Homebrew 安装的话,在终端输入brew install --cask visual-studio-code。
  • PyCharm:由 JetBrains 开发,是一款专为 Python 开发而设计的强大 IDE。它提供了高效的代码编辑功能、智能代码补全、代码分析、图形化的调试器以及测试运行系统,还支持多种 Web 开发框架,如 Django、Flask 等,非常适合进行大型 Python 项目开发、Web 开发、科学计算和数据分析等任务。可在 JetBrains 官网下载安装包进行安装,下载完成后,将下载的文件拖动到 "应用程序" 文件夹即可完成安装。

(三)系统设置优化

  1. 调整触控板和键盘设置:MacOS 的触控板操作非常丰富,你可以根据自己的使用习惯进行设置。打开 "系统偏好设置",点击 "触控板",在这里可以设置三指切换应用、四指显示桌面等操作,让你在开发过程中能够更高效地切换应用和操作界面。对于键盘设置,同样在 "系统偏好设置" 中点击 "键盘",可以调整键盘重复率和延迟,使输入更加流畅,提高代码编写的效率。
  2. 关闭文件验证和 App 验证:在开发过程中,有时需要运行一些未签名的应用或文件,这时可以关闭文件验证和 App 验证。打开终端,输入sudo spctl --master-disable,输入密码后回车,即可关闭系统完整性保护(SIP),从而允许运行未签名的应用和文件。但需要注意的是,关闭 SIP 可能会降低系统的安全性,所以在开发完成后,建议重新开启。
  3. 加速动画和关闭键盘输入延迟:为了让系统操作更加流畅,可以在 "终端" 中输入以下命令来加速窗口动画:defaults write NSGlobalDomain NSWindowResizeTime -float 0.001。同时,如果你觉得键盘输入有延迟,可以通过修改配置文件来关闭延迟。在终端输入defaults write -g InitialKeyRepeat -int 10(默认值是 15)和defaults write -g KeyRepeat -int 1(默认值是 2),即可减少键盘输入延迟,让你在编写代码时更加得心应手。

二、MacOS 应用开发流程

(一)需求分析与设计

在开始 MacOS 应用开发之前,明确应用的功能和目标是至关重要的。这需要与项目相关人员进行充分沟通,深入了解用户需求,分析市场竞争情况,从而确定应用的核心功能和独特卖点。例如,若要开发一款文件管理应用,需考虑用户对文件分类、搜索、备份等方面的需求,以及如何在众多类似应用中脱颖而出,如提供更便捷的操作方式、更高效的搜索功能等。

用户界面设计是应用开发的重要环节,它直接影响用户体验。要遵循苹果的人机交互指南,确保界面简洁、直观、易于操作。使用 Sketch、Adobe XD 等设计工具进行界面原型设计,通过绘制草图、创建交互流程,不断优化界面布局和元素设计。例如,设计一个图像编辑应用的界面时,要合理安排各种工具按钮的位置,使其符合用户的操作习惯,方便用户快速找到并使用所需功能。

架构设计则决定了应用的整体结构和性能。可以根据应用的复杂程度选择合适的架构模式,如 MVC(Model - View - Controller)、MVVM(Model - View - ViewModel)等。MVC 模式将应用分为模型、视图和控制器三个部分,模型负责数据处理,视图负责展示,控制器负责协调两者之间的交互。以一个简单的待办事项应用为例,模型可以是存储待办事项数据的结构体或类,视图是显示待办事项列表和输入框的界面,控制器则负责处理用户添加、删除、修改待办事项的操作,并更新视图和模型。

(二)代码编写

根据开发的应用类型和需求,选择合适的编程语言。在 MacOS 开发中,Swift、Objective - C 和 Python 是常用的编程语言。

  • Swift :这是苹果推出的现代编程语言,具有简洁、安全、高效等特点,越来越受到开发者的青睐。例如,创建一个简单的 Swift 命令行程序,计算两个数的和:

    java 复制代码
    let num1 = 5
    
    let num2 = 3
    
    let sum = num1 + num2
    
    print(\"两数之和为:\(sum)\")
  • Objective - C :作为苹果开发的传统语言,具有良好的兼容性,在一些旧项目或需要与 Cocoa 框架深度集成的场景中仍被广泛使用。以下是用 Objective - C 实现相同功能的代码:

    java 复制代码
    #import <Foundation/Foundation.h>
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            int num1 = 5;
            int num2 = 3;
            int sum = num1 + num2;
            NSLog(@"两数之和为:%d", sum);
        }
        return 0;
    }
  • Python :结合 PyObjC 库,Python 也可以用于 MacOS 应用开发,适合快速原型开发和脚本编写。例如,使用 Python 和 PyObjC 创建一个简单的窗口:

    python 复制代码
    import Cocoa
    
    class MyWindowController(Cocoa.NSWindowController):
        def windowDidLoad(self):
            super(MyWindowController, self).windowDidLoad()
            window = self.window()
            window.setTitle_("Python Mac App")
    
    
    app = Cocoa.NSApplication.sharedApplication()
    windowController = MyWindowController.alloc().initWithWindowNibName_("MainMenu")
    windowController.showWindow_(None)
    app.run()

在编写代码时,要遵循良好的编程规范,注重代码的可读性和可维护性。合理使用注释,清晰地解释代码的功能和逻辑,方便团队成员理解和协作。同时,充分利用各种开发框架和库,如 AppKit(用于构建 Mac 应用的界面)、Foundation(提供基础数据类型和功能)等,提高开发效率。例如,在使用 AppKit 创建一个按钮时,可以这样编写代码:

python 复制代码
import AppKit

class ViewController: NSViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let button = NSButton(frame: NSRect(x: 100, y: 100, width: 100, height: 50))
        button.title = "点击我"
        button.target = self
        button.action = #selector(buttonClicked)
        view.addSubview(button)
    }
    
    @objc func buttonClicked() {
        let alert = NSAlert()
        alert.messageText = "按钮被点击了"
        alert.runModal()
    }
}

(三)测试环节

测试是确保应用质量的关键步骤,通过各种测试方法可以发现并修复潜在的问题。

  • 单元测试 :针对代码中的最小可测试单元(如函数、方法)进行测试,验证其功能是否正确。Xcode 自带的 XCTest 框架是 MacOS 开发中常用的单元测试工具。例如,对一个计算两个整数之和的函数进行单元测试:

    python 复制代码
    import XCTest
    
    func add(_ a: Int, _ b: Int) -> Int {
        return a + b
    }
    
    class MathTests: XCTestCase {
        func testAdd() {
            let result = add(3, 5)
            XCTAssertEqual(result, 8, "加法函数测试失败")
        }
    }
  • 集成测试:用于测试多个模块之间的交互是否正常,确保不同组件能够协同工作。可以使用 Xcode 的测试框架结合模拟对象来进行集成测试。例如,测试一个包含数据模型和视图控制器的简单应用,验证视图控制器能否正确获取和显示数据模型中的数据。

  • 系统测试:对整个应用进行全面测试,包括功能、性能、兼容性等方面。可以使用 Selenium 等工具进行自动化系统测试,模拟用户的操作流程,验证应用在不同场景下的表现。例如,测试一个文件管理应用在不同文件数量、不同系统版本下的文件操作功能是否正常,以及应用的响应速度和内存占用情况。

在测试过程中,要编写详细的测试用例,覆盖各种可能的输入和边界条件。及时记录和修复测试中发现的问题,确保应用的稳定性和可靠性。同时,定期进行回归测试,防止在后续开发中引入新的问题。

(四)部署与发布

完成测试后,就可以将应用打包并发布到目标平台。

  • 应用打包:在 Xcode 中,选择 "Product" -> "Archive",Xcode 会对应用进行编译和打包,生成一个归档文件。在归档过程中,要确保应用的图标、版本号等信息设置正确。例如,在 Xcode 的项目设置中,找到 "General" 选项卡,上传应用图标,设置版本号和构建号,这些信息将显示在应用的安装包和 App Store 上。
  • 发布到 App Store:将归档文件提交到 App Store Connect 进行审核。在提交之前,需要准备好应用的描述、截图、隐私政策等资料。描述要简洁明了,突出应用的功能和特点;截图要展示应用的主要界面和功能,吸引用户下载。隐私政策则要明确说明应用如何收集、使用和保护用户数据,确保符合相关法律法规。审核过程可能需要一定时间,期间要关注审核反馈,及时处理审核人员提出的问题。
  • 其他发布平台:除了 App Store,也可以选择将应用发布到其他平台,如 Mac App Store 之外的网站、第三方应用市场等。但需要注意不同平台的发布规则和要求,确保应用能够顺利上线。例如,发布到网站时,要提供易于下载和安装的方式,可能需要使用 DMG 格式的安装包,并提供详细的安装说明。

三、常见问题及解决方案

在 MacOS 开发环境配置与应用开发过程中,难免会遇到一些问题,以下是一些常见问题及对应的解决方案。

(一)依赖库安装失败

在使用 Homebrew 或 pip 安装依赖库时,可能会遇到安装失败的情况,报错信息中常常包含网络连接问题、依赖冲突或权限不足等提示。

  • 网络连接问题:如果是网络连接不稳定或超时导致的安装失败,可以尝试更换网络,或者使用代理服务器。比如在终端中设置 HTTP 代理:export http_proxy=http://your_proxy_address:port,export https_proxy=https://your_proxy_address:port ,这里your_proxy_address是代理服务器地址,port是端口号,设置完成后再重新执行安装命令。
  • 依赖冲突:当出现依赖冲突时,需要仔细查看错误信息,了解冲突的具体依赖库。有时可以通过指定依赖库的版本来解决冲突,例如pip install package_name==specific_version,这里package_name是依赖库名称,specific_version是指定的版本号。还可以尝试使用虚拟环境(如 venv、virtualenv)来隔离不同项目的依赖,避免相互干扰。例如,使用 venv 创建虚拟环境:python3 -m venv myenv,然后激活虚拟环境:source myenv/bin/activate,在虚拟环境中进行依赖库安装,这样可以保证每个项目都有独立的依赖环境 。
  • 权限不足:若提示权限不足,可以使用sudo命令获取管理员权限进行安装,但不建议频繁使用sudo安装,以免对系统造成不必要的影响。例如sudo brew install package_name。更好的解决方法是将当前用户添加到相应的权限组,或者修改安装目录的权限,使当前用户具有写入权限。比如对于 Python 库的安装,可以修改 Python 的 site-packages 目录权限,让当前用户可以写入:sudo chown -R your_username /Library/Python/3.8/site-packages,这里your_username是当前用户名,3.8 是 Python 版本号,根据实际情况修改 。

(二)编译错误

在使用 Xcode 或其他编译器进行代码编译时,可能会遇到各种编译错误,错误信息常常包含语法错误、缺少头文件、链接错误等。

  • 语法错误:这是最常见的编译错误,通常是由于代码书写不规范导致的。仔细查看错误提示,定位到错误所在的代码行,检查代码的语法是否正确。例如,在 Swift 中,变量声明时类型不匹配就会导致语法错误:let num: Int = "abc",这里将字符串赋值给了整型变量,应改为let num: Int = 10。
  • 缺少头文件:如果编译时提示缺少头文件,首先检查头文件是否确实存在于项目中。若存在,确认头文件的路径是否正确,是否需要在编译器的设置中添加头文件搜索路径。例如,在使用 C++ 开发时,如果使用了自定义的头文件myheader.h,且该头文件位于项目的include目录下,可以在 Xcode 的项目设置中,找到 "Build Settings",搜索 "Header Search Paths",添加(SRCROOT)/include,这里(SRCROOT)表示项目根目录 。
  • 链接错误:链接错误通常是由于找不到函数或库的定义导致的。检查是否正确链接了相关的库文件,在 Xcode 中,需要在 "Build Phases" -> "Link Binary With Libraries" 中添加所需的库。比如在开发一个使用 SQLite 数据库的应用时,需要添加libsqlite3.dylib库。如果库文件的路径不正确,也会导致链接错误,此时需要确保库文件的路径设置正确。例如,使用第三方库时,库文件可能位于自定义的目录下,需要在 "Build Settings" -> "Library Search Paths" 中添加该目录的路径 。

(三)Xcode 相关问题

Xcode 作为 MacOS 开发的重要工具,在使用过程中也可能出现一些问题。

  • Xcode 无法启动或闪退:这可能是由于 Xcode 版本与 MacOS 系统版本不兼容,或者 Xcode 安装文件损坏导致的。首先检查 Xcode 版本是否支持当前的 MacOS 系统版本,如果不支持,升级或降级 Xcode 版本。若怀疑安装文件损坏,可以尝试重新下载并安装 Xcode。在下载前,先卸载当前的 Xcode,打开 "应用程序" 文件夹,将 Xcode 拖移到废纸篓,然后清空废纸篓。接着在 App Store 中重新下载安装 Xcode。
  • 模拟器无法正常运行:有时模拟器会出现无法启动、启动后黑屏或运行应用时出错等问题。确保模拟器的版本与 Xcode 和应用的目标版本兼容,在 Xcode 的 "Window" -> "Devices and Simulators" 中,选择正确的模拟器版本。如果模拟器出现异常,可以尝试重置模拟器,在模拟器的菜单栏中选择 "Hardware" -> "Erase All Content and Settings",然后重新启动模拟器。此外,检查电脑的内存和磁盘空间是否充足,内存不足或磁盘空间不足也可能导致模拟器运行异常。

四、实战案例:开发一个简单 MacOS 应用

接下来,我们以开发一个简单的待办事项应用为例,完整展示从创建项目到发布的全过程,帮助你更直观地理解 MacOS 应用开发的流程。

(一)创建项目

打开 Xcode,在欢迎界面选择 "Create a new Xcode project",或者点击菜单栏中的 "File" -> "New" -> "Project"。在模板选择页面,选择 "macOS" 下的 "App",然后点击 "Next"。在项目设置页面,输入项目名称 "TodoApp",组织标识符(Organization Identifier)可采用反向域名格式,如 "com.yourcompany",语言选择 "Swift",用户界面(Interface)选择 "Storyboard",其他选项保持默认,点击 "Next"。选择项目保存的位置,然后点击 "Create",这样一个新的 MacOS 应用项目就创建完成了 。

(二)设计用户界面

在项目导航器中找到 "Main.storyboard" 文件并打开,它是应用界面的可视化设计文件。从 Object Library(对象库)中拖拽一个 Table View(表格视图)到视图控制器的主视图中,用于显示待办事项列表。再拖拽一个 TextField(文本输入框)和一个 Button(按钮)到视图中,TextField 用于输入新的待办事项,Button 用于添加待办事项。

为了使界面更加美观和布局合理,需要设置这些控件的约束(Constraints)。选中 Table View,点击界面底部的 "Pin" 按钮,设置其与父视图的上下左右间距都为 0,使其铺满整个视图。对于 TextField 和 Button,设置它们水平居中对齐,并且 Button 在 TextField 的右侧,两者之间保持一定的间距。比如 TextField 距离父视图左边距为 20,Button 距离 TextField 右边距为 20 。

(三)编写代码

  1. 定义数据模型 :在项目中创建一个新的 Swift 文件,命名为 "TodoItem.swift"。在该文件中定义一个结构体来表示待办事项:

    java 复制代码
    struct TodoItem {
        var title: String
        var isCompleted: Bool = false
    }
  2. 配置视图控制器 :打开 "ViewController.swift" 文件,在文件顶部导入 AppKit 框架。定义一个数组来存储待办事项,并与界面上的 Table View 和 Button 建立连接。

    python 复制代码
    import Cocoa
    
    class ViewController: NSViewController {
    
        @IBOutlet weak var todoTableView: NSTableView!
        @IBOutlet weak var newTodoTextField: NSTextField!
        
        var todoItems: [TodoItem] = []
    
        override func viewDidLoad() {
            super.viewDidLoad()
            todoTableView.dataSource = self
            todoTableView.delegate = self
        }
    
        @IBAction func addTodoButtonClicked(_ sender: Any) {
            guard let newTodo = newTodoTextField.stringValue else { return }
            let item = TodoItem(title: newTodo)
            todoItems.append(item)
            todoTableView.reloadData()
            newTodoTextField.stringValue = ""
        }
    }
    
    extension ViewController: NSTableViewDataSource {
        func numberOfRows(in tableView: NSTableView) -> Int {
            return todoItems.count
        }
    }
    
    extension ViewController: NSTableViewDelegate {
        func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
            let cell = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "TodoCell"), owner: self) as? NSTableCellView
            cell?.textField?.stringValue = todoItems[row].title
            return cell
        }
    }

在这段代码中,ViewController类负责管理视图和用户交互。@IBOutlet属性将界面上的控件与代码关联起来,@IBAction方法处理按钮点击事件,将新的待办事项添加到数组中并刷新表格。NSTableViewDataSource和NSTableViewDelegate的扩展分别实现了表格视图的数据提供和单元格配置功能。

(四)测试应用

点击 Xcode 右上角的运行按钮(或使用快捷键 Command + R),选择一个 Mac 模拟器或直接在本地 Mac 设备上运行应用。在应用运行界面,在文本输入框中输入待办事项,点击 "添加" 按钮,待办事项会显示在表格中。通过这样的测试,可以验证应用的基本功能是否正常,如添加待办事项、显示待办事项列表等。在测试过程中,若发现问题,如按钮点击无反应、表格不更新等,可利用 Xcode 的调试工具,如设置断点、查看变量值等,来定位和解决问题。

(五)打包与发布

  1. 应用打包:选择菜单栏中的 "Product" -> "Archive",Xcode 会对应用进行编译和打包,生成一个归档文件。在归档过程中,Xcode 会检查应用的代码、资源文件等是否存在问题,若有问题会提示错误信息,需要根据提示进行修复。
  2. 发布到 App Store:将归档文件提交到 App Store Connect 进行审核。在提交之前,需要在 App Store Connect 上注册应用,填写应用的名称、描述、截图、隐私政策等信息。应用名称要简洁易记,能准确传达应用的功能;描述要详细介绍应用的特点和优势,吸引用户下载;截图要展示应用的主要界面和功能,让用户对应用有直观的了解;隐私政策则要明确说明应用如何收集、使用和保护用户数据,确保符合相关法律法规。提交审核后,需要耐心等待审核结果,期间要关注审核反馈,及时处理审核人员提出的问题。
  3. 其他发布方式:除了发布到 App Store,也可以选择将应用发布到其他平台,如 Mac App Store 之外的网站、第三方应用市场等。发布到网站时,需要将应用打包成 DMG 格式的安装包,并提供详细的安装说明,方便用户下载和安装。在发布到第三方应用市场时,要了解其发布规则和要求,确保应用能够顺利上线。

相关推荐
IT北辰43 分钟前
源码:用Python进行电影数据分析实战指南
开发语言·python
一直走下去-明1 小时前
flask学习1-基础
python·学习·flask
韩师学子--小倪2 小时前
ubuntu20 安装python2
python
千益2 小时前
玩转python:python 异常处理从基础到实战
python
wang_yb2 小时前
『Python底层原理』--GIL对多线程的影响
python·databook
黑客笔记2 小时前
第4章 漏洞管理(网络安全防御实战--蓝军武器库)
python·web安全·网络安全
weixin_307779133 小时前
Python使用SFTP批量上传和下载一个目录下的所有文件
服务器·开发语言·python
老胖闲聊4 小时前
Python在实际工作中的运用-提取Pdf文件内容
python·pdf·excel
lisw054 小时前
如何下载安装 PyCharm?
ide·python·pycharm