84669 personnes étudient
152542 personnes étudient
20005 personnes étudient
5487 personnes étudient
7821 personnes étudient
359900 personnes étudient
3350 personnes étudient
180660 personnes étudient
48569 personnes étudient
18603 personnes étudient
40936 personnes étudient
1549 personnes étudient
1183 personnes étudient
32909 personnes étudient
path = 'cd appname/3/' upd = 'svn ci -m "update code"' 我如果 os.system(path) os.system(upd)就说不是在working copy里(估计第一个语句对第二个无效) 如果把两个整合在一个字符串里再执行结果就只是进入了那个目录而已,第二个没有执行。 请问怎么实现?
学习是最好的投资!
你需要了解os.system的工作原理:
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...
关于子进程的创建需要明确两点:
PWD
system
根据这两点,执行os.system(path)引发的工作目录变更作用范围仅限于第一个被创建的子进程,故而当前的工作目录没有变更,到执行os.system(upd)就会报错。关于这点,可以用REPL验证如下:
os.system(path)
os.system(upd)
>>> 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 都提到了。
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')
不过,如文档所说,os.system实现机制是相当简单的。除了os模块中的这个方法外,还有其他模块可以实现类似的效果,而且更好更安全。推荐使用subprocess模块,你可以直接设置子进程的环境变量(使用env参数,而cwd参数可设置工作目录),例如:
os
env
cwd
>>> os.getcwd() '/Users/user1' >>> subprocess.call('ls', cwd='/etc') afpovertcp.cfg ftpusers ...
os.system('cd appname/3/ && ls')
另外你也可以用os.chdir(),记得chdir回来。
可选的一个:
os.system("cd ~;ls")
你需要了解
os.system
的工作原理:关于子进程的创建需要明确两点:
PWD
就是环境变量之一)system
函数,子进程无法影响父进程中的环境变量根据这两点,执行
os.system(path)
引发的工作目录变更作用范围仅限于第一个被创建的子进程,故而当前的工作目录没有变更,到执行os.system(upd)
就会报错。关于这点,可以用REPL验证如下:要达到预期的效果,如果仍使用
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.chdir(),记得chdir回来。
可选的一个: