2013-07-26 18 views
7

Ben alt işlemi kullanmak isteyen bir kopyalama işlemi (aşağıdaki kodu) gerçekleştirmek için çağırır:Python altişlem Hata

import subprocess 
pr1 = subprocess.call(['cp','-r','./testdir1/*','./testdir2/'], shell = True) 

ve ben belirten bir hata var:

cp: missing file operand 

Try `cp --help' for more information. 

zaman Ben bu sorunu nasıl alabilirim

cp: cannot stat `./testdir1/*': No such file or directory 

olsun, shell=False ile deneyin?

Ben 2.6

Dip not RedHat Linux GNOME Deskop sürüm 2.16.0 ve bash kabuğu ve Python kullanıyorum , subprocess.call bir dize değil, bir liste geçmesi Ben Problems with issuing cp command with Popen in Python gönderilmiş soruyu okumak ve ben shell=True kullanırken :(

cevap

12

belirtildiği gibi benim için çalışmıyor shell = True seçeneğini kullanarak önerdi:

subprocess.call('cp -r ./testdir1/* ./testdir2/', shell=True) 

The docs say:..

Unix üzerinde kabuk ile = doğru,/bin/sh kabuk varsayılan bağımsız değişken bir dize ise, dize kabuk aracılığıyla yürütülecek komutu belirtir Bu, dizenin kabuk istemine yazıldığında tam olarak olarak biçimlendirilmesi gerektiği anlamına gelir. Bu, örneğin, tırnak veya boşluk içeren ters eğik çizgi kaçan dosya isimlerini içerir. Hatalar bir dizisidir, ilk öğe komut dizesini belirtir ve ek öğelerine, kabuk 'un kendisine ek argümanlar olarak davranılacaktır. Bu yüzden, bir liste subprocess.Popen (veya subprocess.call) geçirilir, (Unix), listenin birinci elemanı komut olarak yorumlanır

, listedeki tüm diğer elemanları argüman olarak yorumlanır kabuk. Durumunuzda, kabuklara argümanları aktarmanız gerekmediğinden, bir dizeyi ilk argüman olarak iletebilirsiniz.

2

Bu eski bir iş parçacığıdır, ancak aynı sorunu yaşıyorum.

bu çağrı ile yapıyorduk sorun:

subprocess.call(['cp','-r','./testdir1/*','./testdir2/'], shell = False) 

ilkinden sonra parametrelerin her cinsinden olduğunu oldu. Kabuk böyle komutu görür So:

cp '-r' './testdir1/*' './testdir2/' 

Sorun şu ki joker karakteri (*) 'dir. Dosya sistemi, testdir1 dizinindeki '*' adının bulunduğu bir dosyayı arar.

Çözüm, shell = True seçeneğini kullanarak çağrıyı seçilen cevap gibi yapmak ve belirtilen parametrelerin hiçbirini yapmaktır.

+0

İyi bir açıklama. Neler olduğunu anlamama yardım etti. – morganw09dev