2

我正在尝试在我的 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 运行命令时不同呢?

4

1 回答 1

0

似乎os.system将它执行的外壳更改为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
...

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

于 2013-07-12T02:05:04.997 回答