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()では、コマンドをシェルから直接実行した場合とは異なる出力が得られるのはなぜでしょうか?

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 シェルで 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 の外部) でシェルに切り替えて同じcpコマンドを実行すると、親の「テンプレート」ディレクトリをコピーせずに機能することです。奇妙な...しかし、シェルに切り替えてPopen強制すると、問題が解決するようです。bash

于 2013-07-12T02:05:04.997 に答える