python之CWD与命令行参数
一些变量
- 当前工作路径(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与命令行参数相关推荐
- Python必备基本技能——命令行参数args详解
Python必备基本技能--命令行参数args详解 1. 效果图 2. 源码 2.1 简单命令行参数 2.1 轮廓检测源代码 参考 这篇博客将介绍一项开发人员.工程师和计算机科学家必备的技能--命令行 ...
- python使用argparse解析命令行参数
python使用argparse解析命令行参数 你的程序如何能够解析命令行选项(位于sys.argv中) #示意使用sys.argv进行参数解析: #注意,sys.argv中第0个索引是函数本身,所以 ...
- python getopt使用_Python命令行参数解析模块getopt使用实例
这篇文章主要介绍了Python命令行参数解析模块getopt使用实例,本文讲解了使用语法格式.短选项参数实例.长选项参数实例等内容,需要的朋友可以参考下 格式 getopt(args, options ...
- python菜鸟教程h-Python 命令行参数
Python 命令行参数 Python 提供了 getopt 模块来获取命令行参数. $ python test.py arg1 arg2 arg3 Python 中也可以使用 sys 的 sys.a ...
- Python 中的解析命令行参数
argparse argparse 是 Python 内置的一个用于命令项选项与参数解析的模块,通过在程序中定义好我们需要的参数,argparse 将会从 sys.argv 中解析出这些参数,并自动生 ...
- python测试testsuite使用命令行参数的问题
如果执行python testcase.py argument时会出现: AttributeError: module '__main__' has no attribute xxx 解决方案: 1. ...
- Python命令行参数解析模块------argparse
首先,argparse 是python自带的命令行参数解析包,可以用来方便地读取命令行参数,当你的代码需要频繁地修改参数的时候,使用这个工具可以将参数和代码分离开来,让你的代码更简洁,适用范围更广 ...
- Python命令行参数学习
man python 查看python的帮助文件 命令行参数: -B Don't write .py[co] files on import. See ...
- python将argv作为参数_在jupyter / ipython notebook中将命令行参数传递给argv
经过大量的环顾后,我发现了非常繁琐的自定义库,但是用几行代码解决了它,我认为这些代码很漂亮.我使用nbconvert最终得到一个html报告作为输出,包含笔记本中的所有图形和降价,但是通过最小的pyt ...
最新文章
- R语言使用ggpubr包的ggdotplot函数可视化水平棒棒糖图(自定义分组数据点色彩、自定义调色板、在两端添加点图的线段segments、整体排序从大到小、自定义数据点的大小、添加数值标签)
- Quorum-based voting
- Visual Stdio VS 错误 error : 0xC00000FD: Stack overflow. 更改堆栈空间解决栈溢出问题
- EXTjs grid与json数据 转载
- Linux下安装并使用MySQL数据库
- oracle的标准写法,oracle 表连接特有写法与标准写法
- MySql按字段分组取最大值记录 [此博文包含图片]
- 基于android个人记账本的软件设计,基于Android的个人记账软件的设计与实现-开题报告...
- 在家也可以免费下载知网文献,5种免费下载知网文献方法
- 通过阿里云容器镜像服务下载谷歌gcr.io镜像
- iOS开发初学者入门需要学习哪些知识?
- lv官网编码查询_成都市居住证编号查询系统
- 全球一月内两次遭到病毒暴击 2017网络安全生态峰会或有解药
- html平行四边形标签,平行四边形
- 股票全自动交易软件的风险有哪些?
- 【STM32L552ZET6QU】小白入门资料汇总
- centos7 离线安装 rar 解压缩软件
- 一流的匠人,必有一流的心性:工作是人生最尊贵、最重要、最有价值的行为
- 如何设计一个监控平台(上篇)
- ABAP术语-ALE
热门文章
- 生成ID模板:年月日时分秒+6位自增码
- #私藏项目实操分享# 提高区块链的可扩展性并不需要牺牲安全和去中心化
- 花的编程代码C语言,C语言花朵代码的.doc
- java实现猜数字小游戏(1-100)
- iOS 仿微信首页下拉弹出小程序
- HandyJSON + RealmSwift 坑
- postgis 返回 geojson
- android 游戏代码,Android小游戏实现代码
- 我这四个月干了些什么
- arse Error at line 58 column 17: The content of element type struts-config must match (display-na