原文链接 http://blog.csdn.net/fengqingting2/article/details/41940149


今天遇到要在os.system中连续执行多条语句的情况,语句如下:

cmd1="cd /d %s" % os.path.dirname(file_path)

cmd2=" Python setup.py install"

如果分为两次执行,即:os.system(cmd1) os.system(cmd2),在执行第二条语句的时候会提示找不到setup.py文件,也就是没有进入到相应的路径,查阅了类似的帖子,有说明如下:

###########################################################################


你需要了解 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')
>>> 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') )。

###########################################################################

最后采用cmd="cd /d %s && python setup.py install" % os.path.dirname(file_path)的形式解决了问题,即采用&&连接多个命令


python中os.system()的返回值

补充一句:如果第三方程序返回的是布尔型返回值,os.system会将true转为1,false转为0进行返回。下面是转发:记得老早的时候python.cn邮件列表上有朋友问过os.system()的返回值异常的问题。今天又碰到啦,所以总结下。 问题: /bin/xxx.py是一个返回码为1的程序。 当python 程序使用os.system(”./bin/xxx.py”) 这样调用的时候, 成功运行后os.system 的返回值出现了问题,变成了256 ,也就是0×100。而不是正常应该返回的1。 解决: 查阅了文档发现 os.system()的返回为: On Unix, the r Read More