您好,匿名用户
随意问技术百科期待您的加入

os.system() 怎么整合两个语句?

0 投票

path = 'cd appname/3/'
upd = 'svn ci -m "update code"'
我如果
os.system(path)
os.system(upd)就说不是在working copy里(估计第一个语句对第二个无效)
如果把两个整合在一个字符串里再执行结果就只是进入了那个目录而已,第二个没有执行。
请问怎么实现?

用户头像 提问 2013年 12月25日 @ Hera 上等兵 (249 威望)
分享到:

1个回答

0 投票
 
最佳答案

你需要了解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...

关于子进程的创建需要明确两点:

  1. 父进程的环境变量(environment variables)会默认传递到子进程中(工作目录PWD就是环境变量之一)
  2. 使用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 ...
用户头像 回复 2013年 12月23日 @ Draven 上等兵 (325 威望)
选中 2013年 9月7日 @Hera
提一个问题:

相关问题

0 投票
1 回复 24 阅读
用户头像 提问 2013年 12月13日 @ Nocturne 上等兵 (262 威望)
+1 投票
1 回复 56 阅读
用户头像 提问 2012年 12月1日 @ 卫宫士郎 上等兵 (173 威望)
0 投票
1 回复 125 阅读
0 投票
1 回复 27 阅读
用户头像 提问 2013年 12月23日 @ Nidalee 上等兵 (346 威望)
0 投票
1 回复 50 阅读

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...