原文链接
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...
关于子进程的创建需要明确两点:
-
父进程的环境变量(
environment variables
)会默认传递到子进程中(工作目录
PWD
就是环境变量之一)
-
使用
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)的形式解决了问题,即采用&&连接多个命令
补充一句:如果第三方程序返回的是布尔型返回值,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