path = 'cd appname/3/'
upd = 'svn ci -m "update code"'
我如果
os.system(path)
os.system(upd)就说不是在working copy里(估计第一个语句对第二个无效)
如果把两个整合在一个字符串里再执行结果就只是进入了那个目录而已,第二个没有执行。
请问怎么实现?
path = 'cd appname/3/'
upd = 'svn ci -m "update code"'
我如果
os.system(path)
os.system(upd)就说不是在working copy里(估计第一个语句对第二个无效)
如果把两个整合在一个字符串里再执行结果就只是进入了那个目录而已,第二个没有执行。
请问怎么实现?
3 回答3.1k 阅读✓ 已解决
1 回答2.9k 阅读✓ 已解决
2 回答1.9k 阅读✓ 已解决
2 回答1.7k 阅读✓ 已解决
2 回答1.3k 阅读✓ 已解决
2 回答1.8k 阅读✓ 已解决
2 回答1.7k 阅读✓ 已解决
你需要了解
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
参数可设置工作目录),例如: