2009-09-08 5 views
11

के साथ समस्या मेरी वर्तमान कार्य निर्देशिका में मेरे पास डीआईआर रूट/अंदर कुछ फाइलें हैं।subprocess.call

मुझे पता है कि मैं cp -r ROOT/* /dst निष्पादित कर सकता हूं और मुझे कोई समस्या नहीं है।

लेकिन अगर मैं अपने अजगर कंसोल खोलें और मैं लिखने के इस:

import subprocess 
subprocess.call(['cp', '-r', 'ROOT/*', '/dst']) 

यह काम नहीं करता है! cp: cannot stat ROOT/*: No such file or directory

आप मेरी मदद कर सकते:

मैं यह त्रुटि है?

+1

इस उदाहरण के लिए, आपको शायद ['shutil.copytree'] (http://docs.python.org/library/shutil.html#shutil.copytree) का उपयोग करना चाहिए, जो वास्तव में (रिकर्सिव निर्देशिका प्रतिलिपि) । – naught101

उत्तर

4

* को फ़ाइल नामों में विस्तारित नहीं किया जाएगा। यह खोल का एक कार्य है। यहां आप वास्तव में * नाम की एक फ़ाइल कॉपी करना चाहते हैं। पैरामीटर shell=True के साथ subprocess.call() का उपयोग करें।

+1

दिलचस्प ... लेकिन यह काम नहीं करता है! –

+0

सही! वह Popen() था। माफ़ कीजिये। –

+0

क्या आपको लगता है नहीं मैं बस इस्तेमाल कर सकते हैं: os.system ('cp -r जड़/*/डीएसटी') यह काम करने के लिए लगता है ... –

7

प्रयास करें

subprocess.call('cp -r ROOT/* /dst', shell=True) 

नोट एक भी स्ट्रिंग के बजाय एक सरणी यहाँ का उपयोग।

या listdir और copy

+0

हां, यह काम करता है ... और मुझे लगता है कि यह ओएससिस्टम के समान ही है ... क्या यह सही है? –

+0

मैं खोल का उपयोग नहीं करना चाहता = सच है, तो क्या कोई और तरीका है? – Rahul

+1

@Rahul: http://docs.python.org/library/glob.html (और देर से उत्तर के लिए खेद है!) –

9

साथ अपने स्वयं के कार्यान्वयन का निर्माण बस इस जबकि कुछ इसी तरह करने का प्रयास कर भर में आया था।

The * will not be expanded to filenames

बिल्कुल। यदि आप cp के मैन पेज को देखते हैं तो आप इसे किसी भी स्रोत तर्क के साथ कॉल कर सकते हैं और आप आसानी से -t स्विच के साथ तर्कों का क्रम बदल सकते हैं।

import glob 
import subprocess 
subprocess.call(['cp', '-rt', '/dst'] + glob.glob('ROOT/*')) 
+1

दरअसल, मुझे लगता है कि यह कुछ ऐसा होना चाहिए 'subprocess.call (['cp', '-rt', '/ dst'] + glob.glob ('रूट/*')) 'चूंकि ग्लोब एक सूची देता है। –

+0

अच्छा बिंदु! मैं अपनी टिप्पणी अपडेट करूंगा! – chetbox

0

स्ट्रिंग + सूची के बजाय सूची के रूप में आदेश प्रदान करें।

निम्न दो आदेशों ही कर रहे हैं: -

First Command:- 
test=subprocess.Popen(['rm','aa','bb']) 

Second command:- 
list1=['rm','aa','bb'] 
test=subprocess.Popen(list1) 

तो एक से अधिक फ़ाइलों ब्लॉब का उपयोग करके फ़ाइलें की सूची प्राप्त करने के लिए और फिर सूची और गंतव्य के सामने करने के लिए 'सीपी' जोड़ने के लिए एक की जरूरत है कॉपी करने के लिए, सूची का अंत और subprocess.Popen() को सूची प्रदान करें।

की तरह: -

list1=blob.blob("*.py") 
list1=['cp']+list1+['/home/rahul'] 
xx=subprocess.Popen(list1) 

यह काम करेंगे।

संबंधित मुद्दे