Python os.system()方法整合并语句怎么实现?,pythonos.system,path = cd ap
Python os.system()方法整合并语句怎么实现?,pythonos.system,path = cd ap
path = 'cd appname/3/'
upd = 'svn ci -m "update code"'
我如果
os.system(path)
os.system(upd)就说不是在working copy里(估计第一个语句对第二个无效)
如果把两个整合在一个字符串里再执行结果就只是进入了那个目录而已,第二个没有执行。
请问怎么实现?
os.system('cd appname/3/ && ls')
另外你也可以用os.chdir(),记得chdir回来。
可选的一个:
os.system("cd ~;ls")
你需要了解os.system的工作原理:
Execute the command (a string) in a subshell. This is implemented by calling the Standard C function system(), and has the same limitations...
关于子进程的创建需要明确两点:
父进程的环境变量(environment variables)会默认传递到子进程中(工作目录PWD就是环境变量之一)使用system函数,子进程无法影响父进程中的环境变量根据这两点,执行os.system(path)引发的工作目录变更作用范围仅限于第一个被创建的子进程,故而当前的工作目录没有变更,到执行os.system(upd)就会报错。关于这点,可以用REPL验证如下:
>>> import os>>> os.getcwd()'/Users/user1'>>> os.system('cd /etc')0>>> os.getcwd()'/Users/user1'
要达到预期的效果,如果仍使用os.system,有两种方法。第一种方法是确保工作目录的变更和svn都在子进程中进行,可以使用复合语句(如os.system('cd path-to-repo && svn ci'))或多个语句(如os.system('cd path-to-repo; svn ci'))。第二种方法则是先在父进程中切换工作目录(os.chdir('path-to-repo')),再利用1.中提到的原理,执行子进程即可(os.system('svn ci'))。这两种方法@hit9 和 @felix021 都提到了。
不过,如文档所说,os.system实现机制是相当简单的。除了os模块中的这个方法外,还有其他模块可以实现类似的效果,而且更好更安全。推荐使用subprocess模块,你可以直接设置子进程的环境变量(使用env参数,而cwd参数可设置工作目录),例如:
>>> os.getcwd()'/Users/user1'>>> subprocess.call('ls', cwd='/etc')afpovertcp.cfg ftpusers ...
编橙之家文章,
相关内容
- 要思路,想用多线程或是多进程读取josn文件怎么写?,多
- 求Python筛选数字集合内满足指定条件的数据方法,pyt
- 学习python语言未来发展前景好不好?不学习数据挖掘和
- Python unicode中文字符串isalpha()\isalnum()返回True怎么理解,
- Python删除html页面文字只留html标签用如何实现,python标
- Python2.7.6输出流重定向无效何解,python2.7.6输出流,还正
- 关于python编码检测与chardet模块应用的一些小问题,py
- Linux执行python时间怎么优化高效,linux执行python,这是一
- 《flask web开发》这本书,数据库中多对多关系怎么用?
- logger相同数据输出两条没实现效果,python源码没找到问题
评论关闭