迈出Pycharm第一步

刘江     2018年06月07日    分类: 技术分享   标签: Python   阅读:  2322     评论1


一、创建并运行你的第一个Python工程

1.关于解释器

在settings配置卡中选择你想要的Python解释器,并在后期可以随时更换。

2.关于虚拟环境

建议为每一个你新建的工程都创建一个对应的虚拟环境。(聊聊好处)

3.创建一个纯Python工程

Python提供了一系列的工程模版,用于创建不同类型的应用。比如Django、Google AppEngine等等。通过这些模版,Pycharm会自动创建相应的目录结构和特殊文件以及运行配置。

本文中,我们只是创建一个简单的Python脚本,所以直接使用纯Python模版就可以了,这样会创建一个空的工程,里面什么都没有。

image.png-198kB

如果你当前已经打开了一个工程。在点击create的时候,Pycharm会询问你是在新窗口还是在当前窗口打开。选择当前窗口打开,这将关闭先前的工程,并显示我们刚才创建的工程。

4.创建Python文件

在工程工具窗口选择工程root目录,右键-New(或者Alt+Insert)。

image.png-19.4kB

在弹出的窗口中选择Python File,并输入文件名Car。Pycharm将新建一个Python文件并打开它等待编辑。

image.png-13.5kB

5.编辑源代码

一旦你开始敲入代码,Pycharm就像一个隐形的程序员一样,观察你的行为并提出建议和。例如,假设你想差创建一个Python类,当你开始输入关键词的时候,pycharm就会自动弹出一个建议列表,如下图所示:

image.png-9.7kB

先择class,再输入类名Car。此时,Pycharm会立刻提示你后面该加一个冒号,然后又提示你该添加缩进:

image.png-10.1kB

注意右边侧栏的带颜色的条纹,将鼠标挪在上面,会显示具体信息的气泡。而在右边侧栏的顶部,有一个类似交通信号的整体代码检查指示器,绿色表示OK,黄色表示有问题但是不影响运行,如果是红色,则表示有严重问题,影响运行,灰色则表示代码规范不合格。

下面我们在类里创建一个__init__: 方法,当你输入左边的圆括号时,Pycharm会自动帮你完成后面的内容:

image.png-4.1kB

作为例子,我们使用下面的代码:

class Car:
    def __init__(self):
        self.speed = 0
        self.odometer = 0
        self.time = 0

    def say_state(self):
        print("I'm going {} kph!".format(self.speed))

    def accelerate(self):
        self.speed += 5

    def brake(self):
        self.speed -= 5

    def step(self):
        self.odometer += self.speed
        self.time += 1

    def average_speed(self):
        return self.odometer / self.time


if __name__ == '__main__':
    my_car = Car()
    print("I'm a car!")
    while True:
        action = input("What should I do? [A]ccelerate, [B]rake, "
            "show [O]dometer, or show average [S]peed?").upper()
        if action not in "ABOS" or len(action) != 1:
            print("I don't know how to do that")
            continue
        if action == 'A':
            my_car.accelerate()
        elif action == 'B':
            my_car.brake()
        elif action == 'O':
            print("The car has driven {} kilometers".format(my_car.odometer))
        elif action == 'S':
            print("The car's average speed was {} kph".format(my_car.average_speed()))
        my_car.step()
        my_car.say_state()

6.运行程序

右键点击编辑界面,选择运行(Ctrl+Shift+F10)。但是我们建议更好的方法是,由于我们有main函数,所以在对应行的左侧栏有个绿色三角图标,如果将鼠标移动到它上面,会显示不同的命令提示,如下图所示:

image.png-6.5kB

而如果你左键点击它,则会弹出一个可执行命令选择框,这里我们选择运行。

image.png-8.8kB

执行结果会显示在运行工具窗口,如下图所示:

image.png-27.1kB

7.配置运行/调试参数

当我们运行刚才的脚本时,Pycharm会创建一个临时的运行/调试配置。我们先保存这个配置,到顶部工具栏的运行下拉框,选择Save configuration选项,如下图所示:

image.png-35.8kB

然后,选择Edit Configurations,看一看我们刚才的具体配置参数是什么。

image.png-47.8kB

在这里,你可以修改命令行参数、工作目录等等。注意它右边的绿色三角,也可以运行Car脚本。但是使用这个按钮的时候,一定要看清楚它左边使用的是哪个配置文件。

二、调试Python应用

1. 查找问题的出处

继续我们上一节的例子。如果在Car脚本运行时,输入s,想要看看我们的平均速度,则会弹出下面的错误:

image.png-28.6kB

我们可以使用Pycharm的调试器来看看倒底发生了什么。要启动调试功能,首先你需要设置一些断点。在第26代码行左侧栏,左键点击,设置断点。

image.png-28.3kB

点击main函数左边的绿色三角,选择Debug 'Car',Pycharm将在底部打开一个调试会话窗口:

image.png-30.2kB

在Console tab,也就是控制台选项卡,中输入‘s’:

image.png-36.6kB

你会发现,断点标记的那一行,底色变成了蓝色。它表示我们到达了当前断点,改行还未执行。

点击左边工具栏中的绿色三角(带尾影的那种),恢复脚本的执行。此时会重现错误的场景,并且在断点行的位置显示红色闪电图标。切换到debugger选项卡,你会看到当前self.time的值为0,这是不允许的。

image.png-26.7kB

为了防止上面的错误,我们需要给这行代码添加一个if判断语句,来检查time是否等于0。

选择average_speed方法中的return self.odometer / self.time这行,按组合键Ctrl+Alt+T或者点选菜单Code | Surround with。Pycharm会自动生成一个if结构,并在判断语句处等待你输入合适的bool表达式:

image.png-15.1kB

我们输入self.time != 0,最终如下图:

image.png-4.1kB

2.调试的细节

调试工具窗口中可以显示专用的frames、variables、watches和console卡片,在其中你可以看到所有的输入和输出信息。如果你想让console窗口固定,可以将此卡片拖出来,形成独立的窗口。

灵活地使用下面步进工具栏中的按钮,可以让你更加精细的控制程序执行节奏。

image.png-6.1kB

调试的过程中,可以实时查看变量的值。之需要点击变量卡片中左侧工具栏里的绿色加号和眼睛样子的图标,然后在输入栏中输入变量的名字(具有自动完成功能)。比如下面的self.time:

image.png-24.9kB

在刚开始的时候,你会看到一个错误,这是因为self.time这个变量当前还没有定义:

image.png-24.7kB

随着程序的继续执行,变量进入定义阶段后,就能看到它的具体值了:

image.png-27.1kB

你可能注意到了,Pycharm还提供在代码行实时显示信息的功能。

image.png-7.2kB

该功能默认开启,如果你没有看到这些信息,在下面的调试工具窗口中,选择齿轮图标,选择第一项目,如下图所示:

image.png-7.4kB

最后,调试器还可以执行语句,例如你想看到某个变量的值,点击工具栏中的计算器样子的图标:

image.png-26.8kB

在弹出框内输入表达式,然后点击Evaluate,如下图所示:

image.png-8.6kB

实际上这个功能在监视面板中也可以实现,但是Evaluate可以修改对象。

例如,加入你输入odometer的期望值,比如50,然后继续步进执行脚本,你会看到下面的结果:

image.png-35.6kB

三、测试Python应用程序

下面简单介绍一下如何在Pycharm中测试程序。

首先在settings|Tools|Python Integrated Tools中选择default testsrunnerunittest,如下图所示:

image.png-16.5kB

然后在我们前面的Car.py文件的Car类的代码处,右键选择Go To,再选择Test(或者直接Ctrl+Shift+T),如下图所示:

image.png-33.6kB

这样会弹出一个选择窗口:

image.png-3.8kB

选择create New Test,再选择test_acceleratetest_brake,点击Ok,如下所示:

image.png-15.1kB

Pycharm会自动生成一个新的名为test_car.py的测试脚本,如下图 所示:

image.png-12.1kB

如果运行该脚本Run ‘Unittest in test_car’,默认会得到失败的结果,如下图:

image.png-33.3kB

如何编写单元测试,不是本文的内容,我们假设已经有了下面的测试代码:

import unittest

from Car import Car


class TestCar(unittest.TestCase):
      def setUp(self):
          self.car = Car()


class TestInit(TestCar):
      def test_initial_speed(self):
          self.assertEqual(self.car.speed, 0)

      def test_initial_odometer(self):
          self.assertEqual(self.car.odometer, 0)

      def test_initial_time(self):
          self.assertEqual(self.car.time, 0)


class TestAccelerate(TestCar):
      def test_accelerate_from_zero(self):
          self.car.accelerate()
          self.assertEqual(self.car.speed, 5)

      def test_multiple_accelerates(self):
          for _ in range(3):
            self.car.accelerate()
          self.assertEqual(self.car.speed, 15)


class TestBrake(TestCar):
       def test_brake_once(self):
           self.car.accelerate()
           self.car.brake()
           self.assertEqual(self.car.speed, 0)

       def test_multiple_brakes(self):
            for _ in range(5):
                self.car.accelerate()
            for _ in range(3):
                self.car.brake()
            self.assertEqual(self.car.speed, 10)

       def test_should_not_allow_negative_speed(self):
           self.car.brake()
           self.assertEqual(self.car.speed, 0)

       def test_multiple_brakes_at_zero(self):
           for _ in range(3):
              self.car.brake()
              self.assertEqual(self.car.speed, 0)

现在,在脚本的最顶处,右键运行测试程序,可以看到有一些测试通过了:

image.png-54.7kB

Pycharm可以自动运行测试代码,你只需要做两件事:

  1. 点击运行工具栏中的Toggle(绿色三角箭头下的第二个,两个灰框,有循环箭头的图标),激活自动测试功能
  2. 点击工具栏中的蓝色齿轮图标,选择Set Autotest Delay,然后选择延迟时间。

这样,每当你对代码修改后,在规定的延迟时间后,都会自动运行测试代码,如下图所示:

image.png-38.4kB

四、创建并运行Django工程

依赖环境自己安装。(安装django)

1.创建新工程

点击File | New Project,在左侧选择Django,右侧进行详细设定,如下图所示:

image.png-228.6kB

建议同时创建虚拟环境,以及一个新的app。

(详细介绍下所有的设定参数)

2.浏览项目结构

如下图所示的工程结构窗口:

image.png-16.3kB

默认情况下,我们看不到Pycharm自己的.idea目录。如果想显示,可以选择工程结构窗口上的project下拉三角框,选择Project Files,如下图所示:

image.png-19.4kB

(介绍一下所有文件和目录的作用)

Tools | Run manage.py task菜单,可以键入Django manage.py所支持的各种命令。

3.配置数据库

左键双击,或者F4,打开settings.py文件。配置如下的参数选项:

image.png-22.3kB

这里我们直接使用SQLite3.

4.运行Django服务器

不一样的运行方式是:Ctrl+Alt+R,进入Pycharm为我们提供的manage.py控制台,输入runserver和参数,启动服务器,如下图所示:

image.png-25.6kB

不出意外,可以看到如下的欢迎界面(1.x非2.x)

image.png-86.6kB

5.创建模型

接下来在models.py中输入下面的代码:

from django.db import models

# the following lines added:
import datetime
from django.utils import timezone

class Question(models.Model):
   question_text = models.CharField(max_length=200)
   pub_date = models.DateTimeField('date published')

   def __str__(self):
       return self.question_text

   def was_published_recently(self):
       now = timezone.now()
       return now - datetime.timedelta(days=1) <= self.pub_date <= now

   was_published_recently.admin_order_field = 'pub_date'
   was_published_recently.boolean = True
   was_published_recently.short_description = 'Published recently?'

class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.DO_NOTHING,)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

    def __str__(self):
        return self.choice_text

6.生成数据表

manage.py控制台输入makemigrations polls

image.png-16.8kB

打开0001_initial.py文件看看:

image.png-44.7kB

运行sqlmigrate polls 0001命令看看:

image.png-39kB

最后执行migrate命令:

image.png-45.9kB

7.启用admin后台

创建超级用户,命令为createsuperuser。

image.png-29.7kB

可以配置运行参数(Run | Edit Configurations),如下图所示:

image.png-5.7kB

image.png-52.7kB

(讲解配置参数)

from django.contrib import admin
from .models import Question #this line added
admin.site.register(Question)#this line added
from django.contrib import admin
from .models import Choice, Question

class ChoiceInline(admin.TabularInline):
    model = Choice
    extra = 3

class QuestionAdmin(admin.ModelAdmin):
    fieldsets = [
            (None,               {'fields': ['question_text']}),
            ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
                ]
    inlines = [ChoiceInline]

admin.site.register(Question, QuestionAdmin)

(注册admin,修改admin显示)

8.编写视图

views.py

from django.http import HttpResponse

def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")

polls/urls.py

from django.conf.urls import url
from . import views
urlpatterns = [
    url(r'^$', views.index, name='index'),
]

urls.py

from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
    url(r'^polls/', include('polls.urls')), #this line added
    url(r'^admin/', admin.site.urls),
]

访问127.0.0.1:8000/polls/

image.png-44.9kB

添加更多视图在polls/views.py

def detail(request, question_id):
    return HttpResponse("You're looking at question %s." % question_id)

def results(request, question_id):
    response = "You're looking at the results of question %s."
    return HttpResponse(response % question_id)

def vote(request, question_id):
    return HttpResponse("You're voting on question %s." % question_id)

在polls.urls.py中添加更多路由:

from django.conf.urls import url
from . import views

urlpatterns = [
url(r'^$', views.index, name='index'),
# ex: /polls/5/
url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'),
# ex: /polls/5/results/
url(r'^(?P<question_id>[0-9]+)/results/$', views.results, name='results'),
# ex: /polls/5/vote/
url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'),
]

访问对应的url,结果如下图

image.png-132.8kB


评论总数: 1



user_image
写这么多篇PyCharm的使用介绍?!IDE用法都大同小异,差不多就行了!

还是来点干货吧!


最新博客:

原来你是这样的Django
Django类视图
Django2.1新手图文入门教程
Django开发常用插件
Django2.1 版本更新说明!独家发布!