精华内容
下载资源
问答
  • 就好比在eclipse中打一个p字母,安alt+/就可以提示,这个功能是用什么数据结构实现的?还是利用其它的技术?
  • 以前把守护进程与后台任务搞混了,后面看了文章才知道这两者的区别,写此文表达自己对守护进程的理解.1:什么是守护进程?所谓守护进程是一种是 Linux 的一种长期运行的后台服务进程,httpd、named、sshd 等服务都是...

    以前把守护进程与后台任务搞混了,后面看了文章才知道这两者的区别,写此文表达自己对守护进程的理解.

    1:什么是守护进程?

    所谓守护进程是一种是 Linux 的一种长期运行的后台服务进程,httpd、named、sshd 等服务都是以守护进程 Daemon 方式运行的,通常服务名称以字母d结尾,也就是 Daemon 第一个字母.

    无需控制终端(不需要与用户交互)

    在后台运行

    生命周期比较长,一般是随系统启动和关闭

    2:守护进程必要性

    通常我们执行任务时是在前台执行,占领了当前终端,此时无法进行操作,就算我们添加了 &符号,将程序放到后台,但也就因为终端断网等问题,导致程序中断。

    所要知道的是:在目前的linux上,有了systemd这个服务,这个服务管理工具可以方便我们写在后台运行的程序,甚至可以代替这种守护进程。通过把写服务的配置文件,让systemd监控我们的程序,可以随系统启动而运行,可以设定启动条件,及其的方便。

    3:进程组

    $ ps -o pid,pgid,ppid,comm | cat

    PID PGID PPID COMMAND

    10179 10179 10177 bash

    10263 10263 10179 ps

    10264 10263 10179 cat

    bash:进程和进程组ID都是 10179,父进程其实是 sshd(10177)

    ps:进程和进程组ID都是 10263,父进程是 bash(10179),因为是在 Shell 上执行的命令

    cat:进程组 ID 与 ps 的进程组 ID 相同,父进程同样是 bash(10179)

    4:会话组

    ​ 多个进程构成一个进程组,而会话组是由多个进程组构建而。而进程组又被称为job,会话有前台作业,也会有后台作业;一个会话可以有一个控制终端,当控制终端有输入和输出时都会传递给前台进程组,比如Ctrl + Z。会话的意义在于能将多个作业通过一个终端控制,一个前台操作,其它后台运行。

    那么如何编写守护进程呢?

    其实编写守护进程很简单,只需要遵循一下几点即可

    1:创建子进程,父进程退出

    PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND

    0 49 49 49 pts/2 70 Ss 0 0:00 /bin/bash

    49 70 70 49 pts/2 70 R+ 0 0:00 \_ ps axjf

    0 17 17 17 pts/1 68 Ss 0 0:00 /bin/bash

    17 68 68 17 pts/1 68 S+ 0 0:00 \_ python hello.py

    68 69 68 17 pts/1 68 S+ 0 0:00 \_ python hello.py

    0 1 1 1 pts/0 1 Ss+ 0 0:00 /bin/bash

    进程 fork 后,父进程退出。这么做的原因有 2 点:

    如果守护进程是通过 Shell 启动,父进程退出,Shell 就会认为任务执行完毕,这时子进程由 init 收养

    子进程继承父进程的进程组 ID,保证了子进程不是进程组组长,因为后边调用setsid()要求必须不是进程组长

    PGID就是进程所属的Group的Leader的PID,如果PGID=PID,那么该进程是Group Leader

    2、子进程创建新会话

    调用setsid()创建一个新的会话,并成为新会话组长。这个步骤主要是要与继承父进程的会话、进程组、终端脱离关系。

    那么问题来了,为什么进程组组长无法调用setsid()呢?

    对于进程组长来说,进程组 ID 已经和 PID 相同了,如果它被允许调用setsid()的话,它的进程组 ID 会保持不变,会出现:

    1:进程组长属于新的会话;

    2:老的进程组成员属于旧的会话。

    这样情况变成了一个进程组的成员属于不同的会话,Linux想要禁止这种情况的发生。

    3、禁止子进程重新打开终端

    此刻子进程是会话组长,为了防止子进程重新打开终端,再次 fork 后退出父进程,也就是此子进程。这时子进程 2 不再是会话组长,无法再打开终端。其实这一步骤不是必须的,不过加上这一步骤会显得更加严谨。

    4、设置当前目录为根目录

    如果守护进程的当前工作目录是/usr/home目录,那么管理员在卸载/usr分区时会报错的。为了避免这个问题,可以调用chdir()函数将工作目录设置为根目录/。

    5、设置文件权限掩码

    文件权限掩码是指屏蔽掉文件权限中的对应位。由于使用 fork()函数新建的子进程继承了父进程的文件权限掩码,这就给该子进程使用文件带来了诸多的麻烦。因此,把文件权限掩码设置为 0,可以大大增强该守护进程的灵活性。通常使用方法是umask(0)。

    6、关闭文件描述符

    子进程会继承已经打开的文件,它们占用系统资源,且可能导致所在文件系统无法卸载。此时守护进程与终端脱离,常说的输入、输出、错误描述符也应该关闭,毕竟这个时候也不会使用终端了。

    守护进程的出错处理

    由于守护进程脱离了终端,不能将错误信息输出到控制终端,即使 gdb 也无法正常调试。常用的方法是使用 syslog 服务,将错误信息输入到/var/log/messages中。

    syslog 是 Linux 中的系统日志管理服务,通过守护进程 syslogd 来维护。该守护进程在启动时会读一个配置文件/etc/syslog.conf。该文件决定了不同种类的消息会发送向何处。

    代码展示

    import os

    import sys

    def daemonize(pid_file=None):

    pid = os.fork()

    if pid:

    sys.exit(0)

    os.setsid()

    _pid = os.fork()

    if _pid:

    sys.exit(0)

    os.umask(0)

    os.chdir('/')

    sys.stdout.flush()

    sys.stderr.flush()

    with open('/dev/null') as read_null, open('/dev/null','w') as write_null:

    os.dup2(read_null.fileno(), sys.stdin.fileno())

    os.dup2(write_null.fileno(), sys.stdout.fileno())

    os.dup2(write_null.fileno(), sys.stderr.fileno())

    if pid_file:

    with open(pid_file,'w+') as f:

    f.write(str(os.getpid()))

    if __name__ == "__main__":

    daemonize('test.txt')

    关于os.dup2这个函数

    os.dup2() 方法用于将一个文件描述符 fd 复制到另一个 fd2。

    Unix, Windows 上可用。

    >>> import os

    >>> f = open("hello.txt","a")

    >>> os.dup2(f.fileno(),1)

    >>> f.close()

    >>> print("hello world")

    >>> print("changed")

    cat hello.txt

    1

    hello world

    changed

    附加话题

    为什么服务器端常常fork两次呢?

    因为这是为了避免产生僵尸进程。

    当我们只fork()一次后,存在父进程和子进程。这时有两种方法来避免产生僵尸进程:

    父进程调用waitpid()等函数来接收子进程退出状态。

    父进程先结束,子进程则自动托管到Init进程(pid = 1)。

    目前先考虑子进程先于父进程结束的情况:

    若父进程未处理子进程退出状态,在父进程退出前,子进程一直处于僵尸进程状态。

    若父进程调用waitpid()(这里使用阻塞调用确保子进程先于父进程结束)来等待子进程结束,将会使父进程在调用waitpid()后进入睡眠状态,只有子进程结束父进程的waitpid()才会返回。 如果存在子进程结束,但父进程还未执行到waitpid()的情况,那么这段时期子进程也将处于僵尸进程状态。

    由此,可以看出父进程与子进程有父子关系,除非保证父进程先于子进程结束或者保证父进程在子进程结束前执行waitpid(),子进程均有机会成为僵尸进程。那么如何使父进程更方便地创建不会成为僵尸进程的子进程呢?这就要用两次fork()了。

    父进程一次fork()后产生一个子进程随后立即执行waitpid(子进程pid, NULL, 0)来等待子进程结束,然后子进程fork()后产生孙子进程随后立即exit(0)。这样子进程顺利终止(父进程仅仅给子进程收尸,并不需要子进程的返回值),然后父进程继续执行。这时的孙子进程由于失去了它的父进程(即是父进程的子进程),将被转交给Init进程托管。于是父进程与孙子进程无继承关系了,它们的父进程均为Init,Init进程在其子进程结束时会自动收尸,这样也就不会产生僵尸进程了。

    展开全文
  • 以前把守护进程与后台任务搞混了,后面看了文章才知道这两者的区别,写此文表达自己对守护进程的理解.1:什么是守护进程?所谓守护进程是一种是 Linux 的一种长期运行的后台服务进程,httpd、named、sshd 等服务都是...

    以前把守护进程与后台任务搞混了,后面看了文章才知道这两者的区别,写此文表达自己对守护进程的理解.

    1:什么是守护进程?

    所谓守护进程是一种是 Linux 的一种长期运行的后台服务进程,httpd、named、sshd 等服务都是以守护进程 Daemon 方式运行的,通常服务名称以字母d结尾,也就是 Daemon 第一个字母.

    无需控制终端(不需要与用户交互)

    在后台运行

    生命周期比较长,一般是随系统启动和关闭

    2:守护进程必要性

    通常我们执行任务时是在前台执行,占领了当前终端,此时无法进行操作,就算我们添加了 &符号,将程序放到后台,但也就因为终端断网等问题,导致程序中断。

    所要知道的是:在目前的linux上,有了systemd这个服务,这个服务管理工具可以方便我们写在后台运行的程序,甚至可以代替这种守护进程。通过把写服务的配置文件,让systemd监控我们的程序,可以随系统启动而运行,可以设定启动条件,及其的方便。

    3:进程组

    $ ps -o pid,pgid,ppid,comm | cat

    PID PGID PPID COMMAND

    10179 10179 10177 bash

    10263 10263 10179 ps

    10264 10263 10179 cat

    bash:进程和进程组ID都是 10179,父进程其实是 sshd(10177)

    ps:进程和进程组ID都是 10263,父进程是 bash(10179),因为是在 Shell 上执行的命令

    cat:进程组 ID 与 ps 的进程组 ID 相同,父进程同样是 bash(10179)

    4:会话组

    ​ 多个进程构成一个进程组,而会话组是由多个进程组构建而。而进程组又被称为job,会话有前台作业,也会有后台作业;一个会话可以有一个控制终端,当控制终端有输入和输出时都会传递给前台进程组,比如Ctrl + Z。会话的意义在于能将多个作业通过一个终端控制,一个前台操作,其它后台运行。

    那么如何编写守护进程呢?

    其实编写守护进程很简单,只需要遵循一下几点即可

    1:创建子进程,父进程退出

    PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND

    0 49 49 49 pts/2 70 Ss 0 0:00 /bin/bash

    49 70 70 49 pts/2 70 R+ 0 0:00 \_ ps axjf

    0 17 17 17 pts/1 68 Ss 0 0:00 /bin/bash

    17 68 68 17 pts/1 68 S+ 0 0:00 \_ python hello.py

    68 69 68 17 pts/1 68 S+ 0 0:00 \_ python hello.py

    0 1 1 1 pts/0 1 Ss+ 0 0:00 /bin/bash

    进程 fork 后,父进程退出。这么做的原因有 2 点:

    如果守护进程是通过 Shell 启动,父进程退出,Shell 就会认为任务执行完毕,这时子进程由 init 收养

    子进程继承父进程的进程组 ID,保证了子进程不是进程组组长,因为后边调用setsid()要求必须不是进程组长

    PGID就是进程所属的Group的Leader的PID,如果PGID=PID,那么该进程是Group Leader

    2、子进程创建新会话

    调用setsid()创建一个新的会话,并成为新会话组长。这个步骤主要是要与继承父进程的会话、进程组、终端脱离关系。

    那么问题来了,为什么进程组组长无法调用setsid()呢?

    对于进程组长来说,进程组 ID 已经和 PID 相同了,如果它被允许调用setsid()的话,它的进程组 ID 会保持不变,会出现:

    1:进程组长属于新的会话;

    2:老的进程组成员属于旧的会话。

    这样情况变成了一个进程组的成员属于不同的会话,Linux想要禁止这种情况的发生。

    3、禁止子进程重新打开终端

    此刻子进程是会话组长,为了防止子进程重新打开终端,再次 fork 后退出父进程,也就是此子进程。这时子进程 2 不再是会话组长,无法再打开终端。其实这一步骤不是必须的,不过加上这一步骤会显得更加严谨。

    4、设置当前目录为根目录

    如果守护进程的当前工作目录是/usr/home目录,那么管理员在卸载/usr分区时会报错的。为了避免这个问题,可以调用chdir()函数将工作目录设置为根目录/。

    5、设置文件权限掩码

    文件权限掩码是指屏蔽掉文件权限中的对应位。由于使用 fork()函数新建的子进程继承了父进程的文件权限掩码,这就给该子进程使用文件带来了诸多的麻烦。因此,把文件权限掩码设置为 0,可以大大增强该守护进程的灵活性。通常使用方法是umask(0)。

    6、关闭文件描述符

    子进程会继承已经打开的文件,它们占用系统资源,且可能导致所在文件系统无法卸载。此时守护进程与终端脱离,常说的输入、输出、错误描述符也应该关闭,毕竟这个时候也不会使用终端了。

    守护进程的出错处理

    由于守护进程脱离了终端,不能将错误信息输出到控制终端,即使 gdb 也无法正常调试。常用的方法是使用 syslog 服务,将错误信息输入到/var/log/messages中。

    syslog 是 Linux 中的系统日志管理服务,通过守护进程 syslogd 来维护。该守护进程在启动时会读一个配置文件/etc/syslog.conf。该文件决定了不同种类的消息会发送向何处。

    代码展示

    import os

    import sys

    def daemonize(pid_file=None):

    pid = os.fork()

    if pid:

    sys.exit(0)

    os.setsid()

    _pid = os.fork()

    if _pid:

    sys.exit(0)

    os.umask(0)

    os.chdir('/')

    sys.stdout.flush()

    sys.stderr.flush()

    with open('/dev/null') as read_null, open('/dev/null','w') as write_null:

    os.dup2(read_null.fileno(), sys.stdin.fileno())

    os.dup2(write_null.fileno(), sys.stdout.fileno())

    os.dup2(write_null.fileno(), sys.stderr.fileno())

    if pid_file:

    with open(pid_file,'w+') as f:

    f.write(str(os.getpid()))

    if __name__ == "__main__":

    daemonize('test.txt')

    关于os.dup2这个函数

    os.dup2() 方法用于将一个文件描述符 fd 复制到另一个 fd2。

    Unix, Windows 上可用。

    >>> import os

    >>> f = open("hello.txt","a")

    >>> os.dup2(f.fileno(),1)

    >>> f.close()

    >>> print("hello world")

    >>> print("changed")

    cat hello.txt

    1

    hello world

    changed

    附加话题

    为什么服务器端常常fork两次呢?

    因为这是为了避免产生僵尸进程。

    当我们只fork()一次后,存在父进程和子进程。这时有两种方法来避免产生僵尸进程:

    父进程调用waitpid()等函数来接收子进程退出状态。

    父进程先结束,子进程则自动托管到Init进程(pid = 1)。

    目前先考虑子进程先于父进程结束的情况:

    若父进程未处理子进程退出状态,在父进程退出前,子进程一直处于僵尸进程状态。

    若父进程调用waitpid()(这里使用阻塞调用确保子进程先于父进程结束)来等待子进程结束,将会使父进程在调用waitpid()后进入睡眠状态,只有子进程结束父进程的waitpid()才会返回。 如果存在子进程结束,但父进程还未执行到waitpid()的情况,那么这段时期子进程也将处于僵尸进程状态。

    由此,可以看出父进程与子进程有父子关系,除非保证父进程先于子进程结束或者保证父进程在子进程结束前执行waitpid(),子进程均有机会成为僵尸进程。那么如何使父进程更方便地创建不会成为僵尸进程的子进程呢?这就要用两次fork()了。

    父进程一次fork()后产生一个子进程随后立即执行waitpid(子进程pid, NULL, 0)来等待子进程结束,然后子进程fork()后产生孙子进程随后立即exit(0)。这样子进程顺利终止(父进程仅仅给子进程收尸,并不需要子进程的返回值),然后父进程继续执行。这时的孙子进程由于失去了它的父进程(即是父进程的子进程),将被转交给Init进程托管。于是父进程与孙子进程无继承关系了,它们的父进程均为Init,Init进程在其子进程结束时会自动收尸,这样也就不会产生僵尸进程了。

    以上就是如何编写python的daemon程序的详细内容,更多关于python的daemon程序的资料请关注脚本之家其它相关文章!

    展开全文
  • 一、通过ODBC DSN建立连接 运用ODBC数据源,首先必须在控制面板的ODBC中设置数据源,然后再编写脚本和数据库源建立连接。1、创建 ODBC DSN 通过在 Windows 的"开始"菜单打开"控制面板",您可以创建基于 DSN 的文件。...

    一、通过ODBC DSN建立连接 运用ODBC数据源,首先必须在控制面板的ODBC中设置数据源,然后再编写脚本和数据库源建立连接。

    1、创建 ODBC DSN     通过在 Windows 的"开始"菜单打开"控制面板",您可以创建基于 DSN 的文件。双击"ODBC"图标,然后选择"系统 DSN"属性页,单击"添加",选择数据库驱动程序,然后单击"下一步"。按照后面的指示配置适用于您的数据库软件的 DSN。常用的数据库软件有Microsoft Access和SQL Server等,这里以SQL Server 数据库为例。     配置 SQL Server 数据库系统  DSN:注意如果数据库驻留在远程服务器上,请与服务器管理员联系,获取附加的配置信息;下面的过程使用 SQL Server 的 ODBC 默认的设置,它可能不适用于您的硬件配置。在"创建新数据源"对话框中,从列表框中选择"SQL Server",然后单击"下一步"。键入 DSN 文件的名称,然后单击"下一步"。单击"完成"创建数据源。键入运行 SQL 服务程序的服务器的名称、登录 ID 和密码。在"创建 SQL Server 的新数据源"对话框中,在"服务器"列表框中键入包含 SQL Server 数据库的服务器的名称,然后单击"下一步"。选择验证登录 ID 的方式。如果要选择 SQL 服务器验证,请输入一个登录 ID 和密码,然后单击"下一步"。在"创建 SQL Server 的新数据源"对话框中,设置默认数据库、存储过程设置的驱动程序和 ANSI 标识,然后单击"下一步"。(要获取详细信息,请单击"帮助"。)在对话框(同样名为"创建 SQL Server 的新数据源")中,选择一种字符转换方法,然后单击"下一步"。(详细信息,请单击"帮助"。)在下一个对话框(同样名为"创建 SQL Server 的新数据源")中,选择登录设置。 注意典型情况下, 您只能使用日志来调试数据库访问问题。 在"ODBC Microsoft SQL Server 安装程序"对话框中,单击"测试数据源"。如果 DSN 正确创建,"测试结果"对话框将指出测试成功完成。

    2、编写脚本和数据库源建立连接       ADO(ActiveX Data Objects ) 提供 Connection 对象,可以使用该对象建立和管理应用程序和 ODBC 数据库之间的连接。Connection 对象具有各种属性和方法,可以使用它们打开和关闭数据库连接。编写数据库连接脚本,首先应创建 Connection 对象的实例,接着打开数据库连接: 二、通过oledb建立连接 运用oledb方法建立页面与数据库的连接, 不需要创建 ODBC DSN数据源,直接编写如下的脚本和数据源建立连接,是一种简单易用的方法。

    三、通过driver建立连接 通过driver建立页面与数据库的连接,同样不需要创建ODBC DSN数据源,但必须知道实际的数据库文件路径或者数据源名(例如,SQLserver的数据库)。 四、实例(登陆系统)    无论是进入论坛发表自己观点,还是进入自动化管理系统,都需要用户填写登录信息,系统在自身的数据库中检查是否有此用户的注册信息,如果检测到,用户即可顺利登录。而这一登录检查过程的实现,就需要后台数据库与前台页面的连接。 代码实现:连接脚本程序可单独写为一页命名为conn.asp ,需要时引用即可。也可直接写在登录检查页面中。

    conn.asp源代码: login_check.asp ( 登录检查页 )

    展开全文
  • 如何让自己编写程序成为可直接执行文件? 不想每次要运行程序都要打开编译器?
  • 今天想记录的学习主题是——基于pythonista3 app开发自己的iphone应用程序。~~~上课铃~~~(由于今天被小伙伴推荐了这首歌,因此就应他的要求,作为此文的背景音乐吧!)1写在前面之前看到翔哥发过一篇如何将安卓手机...

    哈喽大家好,我是鹏哥。

    今天想记录的学习主题是 ——基于pythonista3 app开发自己的iphone应用程序。

    ~~~上课铃~~~

    (由于今天被小伙伴推荐了这首歌,因此就应他的要求,作为此文的背景音乐吧!)

    1

    写在前面

    之前看到翔哥发过一篇如何将安卓手机打造成Python开发环境,心生羡慕。可是由于不舍得那么多的英雄和皮肤,因此只能继续玩着iphone。

    网上有很多人都说Appstore里也有 python的开发工具:Pythonista 3,售价68元。对这款app,大家的评价都被五毛党刷成:虽贵真香。抱着被骗的心态,我也花了68元大洋玩了。结果是:

    真香!真香!

    2

    效果展示

    本次开发的应用程序(其实就是个小程序,但是不做标题党,没人关注呀

    )是个查看杭州天气的功能。

    桌面app:weather

    运行结果:

    点击桌面app图标或者通过siri “查看天气”:,都可以实现以下功能。

    3

    如何玩呢

    下面我从零开始,一步步教大家如何开发属于自己的iphone应用。

    (1)从Appstore下载pythonista 3

    (2)安装pip依赖的环境脚本:stash库

    python之所以简单易用,能通过Pip命令快速安装python库是其中重要的一个原因。因为如果在手机上开发python应用,自然也要安装各种依赖库。但是Pythonista 3本身并不支持pip命令,但是国外大神自己在GitHub上编写了程序,实现了iphone pip命令的调用。

    有兴趣的同学,可以访问以下地址学习Pip具体实现的代码实现。

    GitHub地址:https://github.com/ywangd/stash

    那么我们如何在iphone上下载stash库呢?

    很简单,在pythonista 3的console界面输入以下代码:

    import requests as r;exec(r.get('https://bit.ly/get-stash').text)

    Tips: 一直右划,就会划到console界面

    (3)下载stash及调用launch_stach.py的坑:

    如果你家网络不好,你就会遇到下面的报错了:HTTPSConnect连接超时。

    这里有个办法可以规避,即用电脑直接从github网站上下载getstash.py,然后通过微信转给iphone。最后在iphone 执行getstash.py也可以成功下载stash库。

    成功界面如下:

    下载成功的stash库会在site-packagesX里(如下图,随机一个文件夹)

    从这 里还可以看到Python2/3的标准库也被pythonista 3统一下载好了,太贴心!

    然后你会发现,怎么没有启动Pip的脚本:launch_stach.py呢?因为launch_stach.py被自动放到了iphone的最外层文件夹。

    然后你就可以像电脑上一样,通过pip命令下载库了:

    Tips: 有些库还是无法下载的,如Pyqt5

    (4)编写python代码

    说实话,在iphone上写爬虫代码有点傻,因为手机打字还是不方便。因此我是在电脑上编码,然后通过微信传到手机上实现的。

    (5)在桌面上添加应用程序图标

    在Pythonista 工具按钮里,有个Home Screen图标,即可将代码添加至iphone桌面上,如下图

    (为什么是通话中?

    因为welcome to join the conference……,某些同学懂)

    (6)添加快捷命令到siri

    选择

    创建快捷指令,然后选择

    脚本--pythonista3 运行脚本。这些操作按界面提示来即可,没什么难度了。然后就可以通过“嗨 Siri”来帮你自动运行python脚本了。是不是很屌?

    4

    示例代码

    因此不再详细介绍代码了。

    # coding=utf-8# @Auther : "鹏哥贼优秀"# @Date : 2019/7/28# @Software : PyCharmimport randomfrom bs4 import BeautifulSoupimport requestsdef getheaders():user_list = ["Opera/9.80 (X11; Linux i686; Ubuntu/14.10) Presto/2.12.388 Version/12.16","Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14","Mozilla/5.0 (Windows NT 6.0; rv:2.0) Gecko/20100101 Firefox/4.0 Opera 12.14","Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0) Opera 12.14","Opera/12.80 (Windows NT 5.1; U; en) Presto/2.10.289 Version/12.02","Opera/9.80 (Windows NT 6.1; U; es-ES) Presto/2.9.181 Version/12.00","Opera/9.80 (Windows NT 5.1; U; zh-sg) Presto/2.9.181 Version/12.00","Opera/12.0(Windows NT 5.2;U;en)Presto/22.9.168 Version/12.00","Opera/12.0(Windows NT 5.1;U;en)Presto/22.9.168 Version/12.00",]user_agent = random.choice(user_list)headers = {'User-Agent': user_agent}return headersdef weather():url = "http://www.weather.com.cn/weather/101210101.shtml"headers = getheaders()r = requests.get(url, headers=headers)r.encoding = 'utf-8'soup = BeautifulSoup(r.text, "lxml")lines = soup.find('li', class_="sky skyid lv2 on")date = lines.h1.get_text()weather = lines.p.stringlow_temp = lines.find('p', class_="tem").i.get_text()if not lines.find('p', class_="tem").span:high_temp = "未知"else:high_temp = lines.find('p', class_="tem").span.get_text()temp = high_temp + '-' + low_tempwind = lines.find('span', class_="NNW").get('title')windnumber = lines.find('p', class_="win").i.get_text()result = {"日期": date,"天气": weather,"温度": temp,"风向": wind,"风级": windnumber}print(u"日期:{0} \n天气:{1} \n温度:{2} \n风向:{3} \n风级:{4}".format(date, weather, temp, wind, windnumber))return resultif __name__ == "__main__":print('*****程序开始!******')weather()print('*****程序结束!******')

    对了,要运行这段代码,需要在pyhonista中下载lxml库。如果不想下载,可以将soup = BeautifulSoup(r.text, "lxml") 改成,效果是一样的。

    soup = BeautifulSoup(s, "html.parser")

    5

    总结

    Pythonista3 在sample里有些很有意思的代码,如消消乐

    (300行代码实现的,大神是真的牛逼!

    )、三维绘图等。

    然后预告下周的博客主题,基于Pythonista 3开发自己的iphone入口,如下图。好啦,下周见!

    ~~~下课铃~~~

    点击下方诗句,可以留言互动喔

    展开全文
  • 生命是一段程序,你怎么编写,它就怎么运行。《了凡四训》讲的是中国明朝袁了凡先生,结合自己亲身经历和毕生学问与修养,为了教育自己的子孙而作的家训,以自己改造命运的经验来现身说法。书中有立命之学、改过之法...
  • Python-第一个自己编写程序Python 约瑟夫生者死者小游戏前言题目:约瑟夫生者死者小游戏数学方案我的代码其中涉及到的坑,提一下看一下教材的代码(比我的简洁太多太多):笔记里更简洁的代码别人程序的学习笔记 ...
  • 但是我的问题又来了,虽然嵌入式系统搭建完成了,可是最终是用来运行自己的程序,达到自己的项目目标的,所以怎么样使自己编写的应用程序在板子上自动运行起来呢?总不能需要我登录到 console 上输入 ./he
  • 不需要鉴黄师,我们自己来 visual c++编写鉴黄程序 1.肤色识别(黄色) 2.脸部识别(女人) 目前我就想了这些,大家能看懂我什么思路吧.
  • 使用if语句编写程序

    千次阅读 2018-02-23 21:27:15
    编写程序时避免语法上的错误,写完程序自己检查一下有没有存在漏洞。 灵活运用if的三种形式、if语句的嵌套和switch语句。不同题目所需不同。 输出最大数 void main() { int a, b, c; scan...
  • ![图片说明](https://img-ask.csdn.net/upload/201602/21/1456019398_50782.png)
  • 如题,我复制了我的一份C++程序,然后编译的时候,出错了。而原来的那个就能够运行。 错误信息如下:error C2664: “strftime”: 不能将参数 3 从“LPCTSTR”转换为“const char * 请问这是什么原因造成的呢?
  • 首先声明下,下面的答案是从博客上粘过来了,因为以前自己写的时候也参考这个写的。基于UDP的聊天程序服务器端源程序:#include "winsock2.h"#include "stdio.h"void main(){//加载套接字...
  • 上一篇文章中有写到如何使用OPENWRT的SDK,这里继续,写怎么在上面开发自己的应用程序。 我欲在OpenWrt上编写一个软件,它能够去读取某个AD芯片的多通道采样值。 在看这篇文章之前请看这官方的文章:...
  • 请问win32项目怎么实现程序的多语言? 我在文件里创建了两组控件,一个是中文,一个是英文。请问怎么编程实现切换?就像下图所示 ![这是中文程序]...
  • 我是一个学物理的学生,有个不是很好的习惯,什么东西不把它的前世今生搞明白了就特别难受,接触计算机语言的时候,看着自己编的c语言代码执行了,但是总是有种蒙在鼓里的感觉,计算机这个东东是怎么执行的我的指令...
  • 每次安装devExpress组件都特别麻烦,要逐个compile package,还要install......接下来可以说怎么编写自动安装程序了 首先说一下思路 ------------------------------------------------------------------...
  • 通过前几节的学习制作,我大致地制作了一个比较完整的 yaffs 根文件系统,到这时候将自己移植的uboot、内核、根文件系统移植到自己的开发板中,一个基本的嵌入式Linux系统也算搭建完成了。但是我的问题又来了,虽然...
  • 脚本之家你与百万开发者在一起导读:对,你没看错,本文就是教你怎么写出让同事无法维护的代码,保证不会被打死。译者:陈皓 (@左耳朵耗子)译文来源:酷壳 – CoolShellhttp://coolshell.cn/articles/4758.html原文...
  • 分享自己编写的一个很简单的网站访问跟踪程序 公司挺多小的一些WEB程序,突然想了解一下这些系统被访问的情况到底怎么样,于是便使用ASP和写了一个这样一个非常简单的基于MYSQL数据库的访问跟踪程序。 它的功能...
  • 扩展资料: JAVA程序的语言特点: 1.简单性 Java看起来设计得很像C++,但是为了使语言小和容易熟悉,设计者们把C++语言中许多可用的特征去掉了,这些特征是一般程序员很少使用的。例如,Java不支持go to语句,代之...
  • 之前自己都是用Visual C++编写c++程序的,今天试了下用VS,结果发现程序运行之后,结果一闪就没了。 【解决方案】 方法1:不要直接按绿色的运行键,而是选择调试->开始执行(不调试) 方法2:加入命令system(...
  • 小弟自己用matlab写了一个动态指数加权的代码,但计算时加权因子不能在0~1任意选择,例如选0.1的时候计算出的SPE2值就会出现负值,这是什么原因造成的啊,求赐教大神帮忙解决,谢谢

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,449
精华内容 579
关键字:

怎么自己编写程序