有趣的是,当我尝试使用bash shell克隆对象时
ssh -t -i ~/.ssh/security.pem root@xx.xxx.xx.xx 'rm -rf myproject && git clon -b mybranch https://github.com/myproject.git'
一切都很美妙。
但是当我尝试从python子进程调用中执行此操作时,如
subprocess.check_call("ssh -t -i ~/.ssh/security.pem root@xx.xxx.xx.xx 'rm -rf myproject && git clone -b mybranch https://github.com/myproject.git'", shell=True)
然后我会收到以下错误:
致命:目标路径'myproject'已经存在且不是空目录
追溯(最近的呼叫最后):
文件“”,第1行,在中
在check_call中文件“C:\ Python27 \ lib \ subprocess.py”,第540行
引发CalledProcessError(retcode,cmd)
答案 0 :(得分:-1)
如果您正在执行长bash命令,则必须将其参数拆分为列表。就像我想使用子进程库运行“ls -a”一样,我必须这样做:
subprocess.call(["ls","-a"])
查看文档以供参考:https://docs.python.org/2/library/subprocess.html
但是,如果您仍然无法删除该文件夹,shutil.rmtree()
将使用shutil库。
答案 1 :(得分:-1)
以下是我发现的:shell = True。出于某种原因,python将执行第一个shell命令' rm -rf myproject'在远程机器中然后关闭SSH连接,最后执行第二个命令' git clone -b branch https://github.com/myproject.git'在本地机器上。在我的情况下,我有相同的git存储库' myproject'在我的本地目录中,所以git尝试克隆我的本地目录并抱怨它。更改为shell = False后,或将其保留,然后一切正常。不确定shell值为什么会导致这种情况?!