python - 为什么python的递归复制和命令行不一样?

标签 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 运行命令时得到的输出不同?

最佳答案

似乎 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/

相关文章:

python - IndexError尝试在python中数值求解差分方程

c++ - 检查套接字关闭

c++ - 对 vector 字符串进行单元测试

css - .htaccess - 拒绝下载文件

java - 如何查找文件的目录

java - Java 中的 listFiles() 方法在 .jar 中不起作用

python - 在 Pyramid 中记录登录用户的最后事件

python - 如何在 python 中将 "&#58;"之类的字符转换为 ":"?

python - Celery Beat Windows 简单示例(不适用于 Django)

linux - 在本地主机中链接(LAMP)