我正在尝试在我的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运行命令时的输出?
答案 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似乎可以解决我的问题。