一些变量

  • 当前工作路径(CWD)
    os.getcwd可以获取脚本启动目录, 许多文件工具隐式地使用该变量。
  • 命令行参数
    sys,argv可以获取在命令行键入的启动参数,将其作为脚本的输入。
  • shell变量
    os.environ可以获取运行他的shell(或父程序)中命名的变量,并传给脚本。
  • 标准流
    sys.stdin,stdout和stderr是三个核心的命令行shell工具,负责输入\输出流,他们可以被脚本以如下方式使用
    print,os.popen调用,subprocess,io.StringIO类等

这些工具可以用作输入脚本,配置参数等。

当前工作路径

  • 除非指定了绝对路径,否则当脚本处理文件时将始终默认他们存在于CWD,脚本可以使用os.getcwd获取明确的cwd路径
    使用os.chdir可以改变他的cwd。
  • 没有完整目录路径的文件名将被映射到cwd路径,和你的PYTHONPATH设置无关
  • 一个脚本总是启动于cwd,而非他所在的目录。反之import 永远首先先搜索文件所在目录,而非CWD(除非脚本刚好在cwd目录)

cwd、文件和import路径

在shell命令行中python dir1\dir2\file.py运行该脚本时,cwd是你键入该命令时所处的路径,而非dir1\dir2。另一方面python自动
将脚本所在目录添加到模块搜索路径的最前面。因而无论从哪里运行,file.py总是可以导入dir1\dir2中的其他文件。

C:…\Mybook_python_programming\test_3\whereami.py

 import os, sysprint('my os.getcwd =>', os.getcwd())                       # 输出cwd执行目录print('my sys.path  =>', sys.path[:1])                      # 输出第一个导入路径

CWD会如预期打印出当前工作路径,同时该路径将会被加载到模块搜索器的最前端

 my os.getcwd => C:\...\Mybook_python_programming\test_3my sys.path  => ['C:\\...\\Mybook_python_programming\\test_3']

但是如果我们在别的路径下运行该脚本,cwd会随之改变(及我们输入命令的路径),并且python会把所在路径添加到模块搜索路径的最前面
从而使得脚本能看到它所在的所有文件。比如当从上一级目录(…)运行时,添加与sys.path最前面的system将会是whereami.py搜索导入
模块的第一个目录,从而将导入指回脚本所在目录。当没有提供完整路径的文件名时,将会被映射到CWD而不是system目录

 (environment) C:\..\Mybook_python_programming>cd test_1(environment) C:\..\Mybook_python_programming\test_1>python ..\test_3\whereami.pymy os.getcwd => C:\..\Mybook_python_programming\test_1my sys.path  => ['C:\\..\\Mybook_python_programming\\test_3']

避免以下两个陷阱

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

CWD和命令行

CWD和导入搜索路径的区别

 C:\temp> pyhton c:\...\PP4E\TOOLs\cleanpyc.py                        process cwd

虽然脚本在TOOLs中,但他在C:\temp上启动,所以它将处理C:\temp中的文件(CWD,非文件所在目录)。要使脚本处理别的文件可以简单的cd到
所要处理的文件目录来改变CWD

 C:\temp> cd C:\PP4thEd\ExamplesC:\PP4thEd\Examples> python c:\...\PP4E\TOOLs\cleanpyc.py          process cwd

由于CWD通常是隐含的,与在python脚本后传递参数的方式相比,cd命令更加清晰,可以指定脚本处理那个目录

 C:\...\PP4E\TOOls> python find.py "*.py" C:\temp                   process name dir
  • 以TOOLs为CWD,使用find.py文件处理temp下的.py文件

  • 在该命令行中, CWD是find.py所处的路径,但在命令行中已经明确指定了要处理的脚本路径(C:\temp), 因此与CWD无关。如果我们想要用一个路径
    的文件去处理另一个路径下的文件,只需要将下面的路径传给两者:

      C:\temp>python c:\...\PP4E\TOOLs\find.py  "*.cxx"  C:\PP4thEd\Examples
    

以temp为CWD,调用TOOLs中的find.py文件处理Examples中的.cxx文件,命令与CWD无关

  • 在命令行中的CWD 即是最开始的 X:…>

##命令行参数
pyhton可以通过sys模块获取脚本启动时命令行输入的信息,通常他们被称为命令行参数,以内置字符串列表的形式存于sys.argv中,与C的argv数组很类似
交互命令行方式启动的python没有命令行参数被传入,所以argv是空串。

 >>> import sys>>> sys.argv['']

想要看到参数,我们得从shell命令行启动脚本。

文件:C:/…/Mybook_python_programming/test_3/testargv.py

 import sysprint(sys.argv)

该脚本将打印出命令行参数列表,无论以什么方式启动,列表的第一项均为所执行脚本的名字。

 (environment) C:\...\Mybook_python_programming>cd test_3(environment) C:\...\Mybook_python_programming\test_3>python testargv.py['testargv.py'](environment) C:\...\Mybook_python_programming\test_3>python testargv.py spam eggs chees['testargv.py', 'spam', 'eggs', 'chees'](environment) C:\...\Mybook_python_programming\test_3>python testargv.py -i data.txt -o results.text['testargv.py', '-i', 'data.txt', '-o', 'results.text']

上述最后一个命令为一种惯例,类似于function参数,,命令行参数通过位置或使用“-name value”词语组来传递。

如同函数参数的作用,命令行参数扮演着同样重要的角色,它们都为程序传递可变信息。由于不需要硬编码,它们使脚本更通用。

解析命令行参数

一旦使用命令行参数, 你会发现直接操作参数列表是不容易的。程序在启动的时候会将它们转换为更易用的结构。如下示例的脚本是扫描argv列表
查询 -optionname optionvalue值对,并以optionname为键值保存到字典结构中方便使用。

文件:C:/…/Mybook_python_programming/test_3/testargv2.py

 "collect command-line options in a dictionary"# 根据传入的命令行参数,返回一个名行参数键值对的字典def getopts(argv):opts = {}# 直到列表为空while argv:# 如果列表的第一个元素的第一个符号为'-',说明这是一个键if(argv[0][0] == '-'):# 将第一个元素设置为键,将紧跟的第二个元素设为该键的值opts[argv[0]] = argv[1]# 更新参数列表将前两个元素切掉argv = argv[2:]# 如果不是一个键,直接将该元素切掉else:argv=argv[1:]return optsif __name__ == '__main__':from sys import argvmyargs = getopts(argv)if '-i' in myargs:print(myargs['-i'])print(myargs)

python之CWD与命令行参数相关推荐

  1. Python必备基本技能——命令行参数args详解

    Python必备基本技能--命令行参数args详解 1. 效果图 2. 源码 2.1 简单命令行参数 2.1 轮廓检测源代码 参考 这篇博客将介绍一项开发人员.工程师和计算机科学家必备的技能--命令行 ...

  2. python使用argparse解析命令行参数

    python使用argparse解析命令行参数 你的程序如何能够解析命令行选项(位于sys.argv中) #示意使用sys.argv进行参数解析: #注意,sys.argv中第0个索引是函数本身,所以 ...

  3. python getopt使用_Python命令行参数解析模块getopt使用实例

    这篇文章主要介绍了Python命令行参数解析模块getopt使用实例,本文讲解了使用语法格式.短选项参数实例.长选项参数实例等内容,需要的朋友可以参考下 格式 getopt(args, options ...

  4. python菜鸟教程h-Python 命令行参数

    Python 命令行参数 Python 提供了 getopt 模块来获取命令行参数. $ python test.py arg1 arg2 arg3 Python 中也可以使用 sys 的 sys.a ...

  5. Python 中的解析命令行参数

    argparse argparse 是 Python 内置的一个用于命令项选项与参数解析的模块,通过在程序中定义好我们需要的参数,argparse 将会从 sys.argv 中解析出这些参数,并自动生 ...

  6. python测试testsuite使用命令行参数的问题

    如果执行python testcase.py argument时会出现: AttributeError: module '__main__' has no attribute xxx 解决方案: 1. ...

  7. Python命令行参数解析模块------argparse

      首先,argparse 是python自带的命令行参数解析包,可以用来方便地读取命令行参数,当你的代码需要频繁地修改参数的时候,使用这个工具可以将参数和代码分离开来,让你的代码更简洁,适用范围更广 ...

  8. Python命令行参数学习

    man python 查看python的帮助文件 命令行参数:        -B     Don't write .py[co] files on import.               See ...

  9. python将argv作为参数_在jupyter / ipython notebook中将命令行参数传递给argv

    经过大量的环顾后,我发现了非常繁琐的自定义库,但是用几行代码解决了它,我认为这些代码很漂亮.我使用nbconvert最终得到一个html报告作为输出,包含笔记本中的所有图形和降价,但是通过最小的pyt ...

最新文章

  1. R语言使用ggpubr包的ggdotplot函数可视化水平棒棒糖图(自定义分组数据点色彩、自定义调色板、在两端添加点图的线段segments、整体排序从大到小、自定义数据点的大小、添加数值标签)
  2. Quorum-based voting
  3. Visual Stdio VS 错误 error : 0xC00000FD: Stack overflow. 更改堆栈空间解决栈溢出问题
  4. EXTjs grid与json数据 转载
  5. Linux下安装并使用MySQL数据库
  6. oracle的标准写法,oracle 表连接特有写法与标准写法
  7. MySql按字段分组取最大值记录 [此博文包含图片]
  8. 基于android个人记账本的软件设计,基于Android的个人记账软件的设计与实现-开题报告...
  9. 在家也可以免费下载知网文献,5种免费下载知网文献方法
  10. 通过阿里云容器镜像服务下载谷歌gcr.io镜像
  11. iOS开发初学者入门需要学习哪些知识?
  12. lv官网编码查询_成都市居住证编号查询系统
  13. 全球一月内两次遭到病毒暴击 2017网络安全生态峰会或有解药
  14. html平行四边形标签,平行四边形
  15. 股票全自动交易软件的风险有哪些?
  16. 【STM32L552ZET6QU】小白入门资料汇总
  17. centos7 离线安装 rar 解压缩软件
  18. 一流的匠人,必有一流的心性:工作是人生最尊贵、最重要、最有价值的行为
  19. 如何设计一个监控平台(上篇)
  20. ABAP术语-ALE

热门文章

  1. 生成ID模板:年月日时分秒+6位自增码
  2. #私藏项目实操分享# 提高区块链的可扩展性并不需要牺牲安全和去中心化
  3. 花的编程代码C语言,C语言花朵代码的.doc
  4. java实现猜数字小游戏(1-100)
  5. iOS 仿微信首页下拉弹出小程序
  6. HandyJSON + RealmSwift 坑
  7. postgis 返回 geojson
  8. android 游戏代码,Android小游戏实现代码
  9. 我这四个月干了些什么
  10. arse Error at line 58 column 17: The content of element type struts-config must match (display-na