为什么python的递归副本与命令行上的不一样?

时间:2013-07-11 19:52:22

标签: python linux directory cp os.system

我正在尝试在我的python脚本中执行目录结构的递归副本。当我通过bash命令行进行复制时:

mike@mike-VirtualBox:~/head$ cp -rf ./applications/app_template/ ./applications/my_dir

我得到了预期的结果:

mike@mike-VirtualBox:~/head$ tree ./applications/my_dir/
./applications/my_dir/
├── cdl
│   ├── include
│   ├── Makefile
│   ...
│   └── other
├── cds
│   ├── include
...

然而,当我尝试通过我的Python脚本做同样的事情时:

print "./applications/"+tar_dir
os.system("cp -rf ./applications/app_template/ ./applications/"+tar_dir)    

我明白了:

mike@mike-VirtualBox:~/head$ tree ./applications/my_dir/
./applications/my_dir/
└── app_template         <--- why did it copy that too?
    ├── cdl
    │   ├── include
    │   ├── Makefile
    │   ...
    │   └── other
    ├── cds
    │   ├── include
    ...

我的python脚本的打印显示我正在使用相同的目标:

./applications/my_dir

你可以看到我的其余命令是一样的。那么为什么我使用os.system()时获得的输出不同于直接从shell运行命令时的输出?

1 个答案:

答案 0 :(得分:0)

似乎os.system将它执行的shell更改为sh

mike@mike-VirtualBox:~/head$ echo $0
bash

mike@mike-VirtualBox:~/head$ python
Python 2.7.3 (default, Apr 10 2013, 06:20:15) 
>>> import os
>>> os.system("echo $0")
sh

当通过Popen使用bash shell执行复制命令时,它按预期工作:

>>> import subprocess
>>> sp.Popen("cp -rf ./applications/icom_app_template ./applications/my_dir", 
              shell=True, executable="/bin/bash")
>>> exit()
mike@mike-VirtualBox:~/head$ tree ./applications/my_dir/
./applications/my_dir/
├── cdl
│   ├── include
│   ├── Makefile
│   ...
│   └── other
├── cds
│   ├── include
...

我唯一没有答案的奇怪之处在于,如果我在命令行(Python之外)切换到sh shell并执行相同的cp命令,则无需工作复制父“模板”目录。奇怪......但切换到Popen并强制bash shell似乎可以解决我的问题。