《Python编程》笔记(二)

脚本运行上下文

  • 除非指定了绝对路径,否则脚本运行时将始终默认它们存在于CWD。可以使用os.getcwd()获取当前的CWD,os.chdir()可以切换CWD。
  • 没有完整目录路径的文件名将被映射到CWD路径,和PYTHONPATH设置无关。
  • 一个脚本启动时总是启动于CWD,而非其所在的目录。反之,import永远首先搜索文件所在的目录,而非CWD(除非该脚本刚好在CWD目录)。
  • 运行下面的代码可以看到上面描述的区别
# file: whereami.py
import os, sys
print(os.getcwd())
print(sys.path[:6])

# 运行结果
my os.getcwd => /home
my sys.path => ['/home/lab', '/home/lab/caffe/python', '/home', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload']
  • 注意:

    • 如果不确定脚本的执行路径,最好使用完整的目录路径限定的文件名
    • 命令行脚本不能总是依赖于CWD来导入不在它所处目录的文件,而应该使用PYTHONPATH的设置和包导入路径来访问其他目录的模块
  • 命令行相关的包:getopt, optparse

  • 在首行使用Unix env命令而非因编码的Python路径,可以降低脚本对机器的依赖性。#!/usr/bin/env python
  • os.environ可以访问环境变量。环境变量可以修改,可以被用作简易的进程通信。
  • Python程序中对Shell所做的设置只对程序本身以及它所衍生的子程序有效。如果需要设置在程序退出后依然有效,需要借助平台相关的扩展来实现。
  • 虽然os.environ的修改会调用os.putenv,但直接调用os.putenv却不会更新os.environ
  • sys模块提供了Python的标准输入、输出和错误流,同时也是通用的程序通信方式。
  • 标准流是预先打开的Python文件对象,它们在Python启动时自动连接到你的程序上。标准流默认在Python启动时被绑定到控制台窗口。
>>> print('Hello, world!')
Hello, world!
>>> sys.stdout.write('Hello, world!\n')
Hello, world!
14
>>> input('Input: ')
Input: hello
'hello'
>>> print('Input'); sys.stdin.readline()[:-1]
Input
hello
'hello'
  • 可以将流重定向到文件或者系统Shell的其他程序。此外,重定向对于预编码测试输入等非常重要。
  • input()会脱去每行的行结束符号。
  • 可以使用管道连接程序。
  • 在脚本内部将sys.stdinsys.stdout重置到文件类的对象,可以实现一个更加普遍适用的重定向方式。在Python中,任何在方法上与文件类似的对象都可以充当标准流。它和对象的的数据类型无关,而取决于接口:

    • 任何提供了类似于文件read方法的对象可以指定给sys.stdin,以从该对象的read方法读取输入;
    • 任何定义了类似于文件write方法的对象都可以指定给sys.stdout,所有的标准输出将发送到该对象的方法上。
  • io.StringIOio.BytesIO工具类可以将文件对象和内存字符串或者内存字节缓冲区映射。

>>> from io import StringIO, BytesIO
>>> buff = StringIO()
>>> buff.write('hello, world')
12
>>> buff.write('spam')
>>> buff.getvalue()
'hello, worldspam'
>>> buff = StringIO('hello, world\nspam')
>>> buff.readline()
'hello, world\n'
>>> buff.readline()
'spam'
>>> buff = StringIO()
>>> >>> tmp = sys.stdout
>>> sys.stdout = buff
>>> print(22, 'good', 'yes')
>>> sys.stdout = tmp
>>> >>> buff.getvalue()
'22 good yes\n'
>>> stream = BytesIO()
>>> stream.write(b'spam')
4
>>> stream.getvalue()
b'spam'
>>> stream = BytesIO(b'spam')
>>> stream.read()
b'spam'
  • 标准错误并没有像printinput那样封装输出和输入流的高级工具。所以,如果需要的话,需要显示调用sys.stderr.write()函数。
  • 可以使用print()函数的file参数指定输出对象。
  • os.popensubprocess工具成为重定向子程序流的又一种方式。可以对脚本启动的程序的流进行重定向,而非重定向脚本本身的流。
  • 在类似Unix平台上,os.fork, os.pipe, os.dup和一些os.exec等组合调用可以用来启动一个新的独立程序,它们的流连接到父程序的流上。

3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值