2014-10-24 4 views
9

मैं एक स्क्रिप्ट के लिए इसी तरह के भीतर से Django में आदेश बोल रहा हूँ करने के लिए:कैसे एक चर करने के लिए Django call_command से उत्पादन को बचाने या फ़ाइल

#!/usr/bin/python 
from django.core.management import call_command 
call_command('syncdb') 
call_command('runserver') 
call_command('inspectdb') 

मैं कैसे उदाहरण call_command के लिए से उत्पादन आवंटित करने के लिए ('inspectdb') एक चर या फ़ाइल के लिए?

मैं

var = call_command('inspectdb') 

लेकिन 'var' की कोशिश की है कोई भी रहता है: उद्देश्य: निरीक्षण विरासत डेटाबेस में मौजूदा टेबल Django

+0

[कैसे बनाने के लिए डाटाबेस डंपफाइल में Django] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/11546151/how-to-make-db-dumpfile- in-django) और [json को फ़ाइल में सहेजने के लिए डंपडाटा कमांड के साथ कॉल कमांड का उपयोग कैसे करें] (http://stackoverflow.com/questions/16075789/how-to-use-call-command-with-dumpdata-command-to -सेव-जेसन-टू-फाइल) – fredtantini

उत्तर

9

आप call_command के उत्पादन रीडायरेक्ट करने के लिए है के द्वारा बनाई गई नहीं है, अन्यथा यह सिर्फ करने के लिए प्रिंट stdout लेकिन कुछ भी नहीं देता है।

with open('/tmp/inspectdb', 'w+') as f: 
    call_command('inspectdb', stdout=f) 
    var = f.readlines() 

संपादित करें: कुछ वर्षों बाद में इस को देखते हुए, एक बेहतर समाधान किया जाएगा एक StringIO बनाने के लिए उत्पादन अनुप्रेषित करने के बजाय, आप एक फाइल करने के लिए यह बचत तो यह इस तरह में पढ़ने की कोशिश कर सकता है, एक असली फाइल यहाँ Django's test suites में से एक से एक उदाहरण है:

def test_command(self): 
    out = StringIO() 
    management.call_command('dance', stdout=out) 
    self.assertIn("I don't feel like dancing Rock'n'Roll.\n", out.getvalue()) 
+0

ने इसे आजमाया, लेकिन ऐसा लगता है कि काम कम नहीं होता है, कमांडलाइन पर इंस्पेक्टडब चलाते समय var खाली हो जाता है, अनुमानित मॉडल उत्पन्न करता है। मैं subprocess कोशिश करेंगे। – Fenrir

+0

FWIW आप शायद कमांड में आउटपुट करने के लिए self.stdout.write() का उपयोग नहीं कर रहे थे। –

+0

मुझे नहीं लगता कि कैसे 'stdout = f' कभी भी कमांड कन्स्ट्रक्टर को बनाता है, जहां' stdout' का उपयोग किया जाएगा। 'call_command' कॉल 'load_command_class (app_name, name)' और stdout पास नहीं करता है और कमांड को 'मॉड्यूल। कमांड()' जैसे तर्कों के साथ तत्काल प्रारंभ किया जाता है। और यहां कमांड का कन्स्ट्रक्टर है: 'def __init __ (self, stdout = none, stderr = none, no_color = गलत): ' – Matt

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