我正在尝试在我的 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 运行命令时得到的输出不同?
最佳答案
似乎 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
当使用 bash shell 通过 Popen 执行复制命令时,它按预期工作:
>>> import subprocess as sp
>>> 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
命令,它可以在不复制父"template"目录的情况下工作。奇怪...但是切换到 Popen
并强制使用 bash
shell 似乎解决了我的问题。
关于python - 为什么python的递归复制和命令行不一样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17602217/