2016-01-19 9 views
6

क्या प्लॉटली (पाइथन के भीतर से उपयोग किया जाता है) "सख्ती से स्थानीय" होना संभव है? दूसरे शब्दों में, क्या इसका उपयोग इस तरीके से करना संभव है कि गारंटी देता है कि यह किसी भी कारण से नेटवर्क से संपर्क नहीं करेगा?किसी भी रूप में नेटवर्क के साथ संचार करने से पाइथन में प्लॉटली को अक्षम करें

इसमें प्लॉटली सेवा से संपर्क करने की कोशिश करने वाले कार्यक्रम की तरह चीजें शामिल हैं (क्योंकि यह व्यावसायिक मॉडल था), और जेनरेट किए गए एचटीएमएल में कहीं भी क्लिक करना सुनिश्चित करने की चीजें या तो प्लॉटली या कहीं और लिंक नहीं होंगी।

बेशक, मैं नेटवर्क से जुड़े उत्पादन मशीन पर ऐसा करने में सक्षम होना चाहता हूं, इसलिए नेटवर्क कनेक्शन खींचना एक विकल्प नहीं है।

+0

क्या आपको बेहतर समाधान मिला है? – LauriK

+0

@LauriK अब तक नहीं। – PonyEars

उत्तर

1

मुझे लगता है कि मैं इसके लिए समाधान के साथ आया हूं। सबसे पहले, आपको ओपन सोर्स Plotly.js file डाउनलोड करने की आवश्यकता है। तब मेरे पास एक फ़ंक्शन है, जो नीचे लिखा गया है, जो पाइथन प्लॉट से जावास्क्रिप्ट का उत्पादन करेगा और साजिश-नवीनतम.min.js की आपकी स्थानीय प्रतिलिपि का संदर्भ देगा। नीचे देखें:

import sys 
import os 
from plotly import session, tools, utils 
import uuid 
import json 

def get_plotlyjs(): 
    path = os.path.join('offline', 'plotly.min.js') 
    plotlyjs = resource_string('plotly', path).decode('utf-8') 
    return plotlyjs 


def js_convert(figure_or_data,outfilename, show_link=False, link_text='Export to plot.ly', 
      validate=True): 

    figure = tools.return_figure_from_figure_or_data(figure_or_data, validate) 

    width = figure.get('layout', {}).get('width', '100%') 
    height = figure.get('layout', {}).get('height', 525) 
    try: 
     float(width) 
    except (ValueError, TypeError): 
     pass 
    else: 
     width = str(width) + 'px' 

    try: 
     float(width) 
    except (ValueError, TypeError): 
     pass 
    else: 
     width = str(width) + 'px' 

    plotdivid = uuid.uuid4() 
    jdata = json.dumps(figure.get('data', []), cls=utils.PlotlyJSONEncoder) 
    jlayout = json.dumps(figure.get('layout', {}), cls=utils.PlotlyJSONEncoder) 

    config = {} 
    config['showLink'] = show_link 
    config['linkText'] = link_text 
    config["displaylogo"]=False 
    config["modeBarButtonsToRemove"]= ['sendDataToCloud'] 
    jconfig = json.dumps(config) 

    plotly_platform_url = session.get_session_config().get('plotly_domain', 
                  'https://plot.ly') 
    if (plotly_platform_url != 'https://plot.ly' and 
      link_text == 'Export to plot.ly'): 

     link_domain = plotly_platform_url\ 
      .replace('https://', '')\ 
      .replace('http://', '') 
     link_text = link_text.replace('plot.ly', link_domain) 


    script = '\n'.join([ 
     'Plotly.plot("{id}", {data}, {layout}, {config}).then(function() {{', 
     ' $(".{id}.loading").remove();', 
     '}})' 
    ]).format(id=plotdivid, 
       data=jdata, 
       layout=jlayout, 
       config=jconfig) 

    html="""<div class="{id} loading" style="color: rgb(50,50,50);"> 
       Drawing...</div> 
       <div id="{id}" style="height: {height}; width: {width};" 
       class="plotly-graph-div"> 
       </div> 
       <script type="text/javascript"> 
       {script} 
       </script> 
       """.format(id=plotdivid, script=script, 
          height=height, width=width) 

    #html = html.replace('\n', '') 
    with open(outfilename, 'wb') as out: 
     #out.write(r'<script src="https://cdn.plot.ly/plotly-latest.min.js"></script>') 
     out.write(r'<script src="plotly-latest.min.js"></script>') 
     for line in html.split('\n'): 
      out.write(line) 

     out.close() 
    print ('JS Conversion Complete') 

कुंजी लाइनों है कि दूर ले जाता सभी लिंक कर रहे हैं:

config['showLink'] = show_link #False 
.... 
config["modeBarButtonsToRemove"]= ['sendDataToCloud'] 

आप इस तरह के रूप में fuction कहेंगे plotly खुले के अपने स्थानीय प्रतिलिपि का संदर्भ देता है एक स्थिर HTML फ़ाइल प्राप्त करने के लिए sourced पुस्तकालय:

fig = { 
"data": [{ 
    "x": [1, 2, 3], 
    "y": [4, 2, 5] 
}], 
"layout": { 
    "title": "hello world" 
} 
} 
js_convert(fig, 'test.html') 
+0

धन्यवाद, यह सहायक है। सवाल पूछने का मेरा उद्देश्य मुख्य रूप से यह देखने के लिए था कि किसी भी नेटवर्क संचार से बचने के लिए एक अंतर्निहित एपीआई थी, या यहां तक ​​कि "टर्न-ऑफ नेटवर्क एक्सेस" तंत्र भी, उदाहरण के लिए, एक मॉड्यूल आयात नहीं करना जो नेटवर्क संचार करेगा। इसका कारण यह सुनिश्चित करना है कि गोपनीय डेटा रिसाव न हो। आपका उत्तर स्थानीय लिंक के साथ काम करने के लिए एक तरीका प्रदान करता है, जो मूल्यवान है लेकिन वह गारंटी प्रदान नहीं करता है। – PonyEars

0

यहां तक ​​कि साधारण import plotly पहले से ही इस उदाहरण के रूप में नेटवर्क से कनेक्ट करने का प्रयास करता है एक पता चलता है:

import logging 
logging.basicConfig(level=logging.INFO) 
import plotly 

उत्पादन होता है: जब get_graph_reference() functionwhile the graph_reference module is initialized कहा जाता है

INFO:requests.packages.urllib3.connectionpool:Starting new HTTPS connection (1): api.plot.ly 

कनेक्शन किया जाता है।

plot.ly सर्वर से कनेक्ट करने से बचने का एक तरीका ~/.plotly/.config में अमान्य plotly_api_domain सेट करना है। मेरे लिए, यह विकल्प नहीं है क्योंकि सॉफ़्टवेयर क्लाइंट की मशीन पर चलाया जाता है और मैं उनकी कॉन्फ़िगरेशन फ़ाइल को संशोधित नहीं करना चाहता हूं। इसके अतिरिक्त, it is also not yet possible to change the configuration directory through an environment variable

एक काम के आसपास plotly आयात करने से पहले बंदर-पैच requests.get के लिए है:

import requests 
import inspect 
original_get = requests.get 

def plotly_no_get(*args, **kwargs): 
    one_frame_up = inspect.stack()[1] 
    if one_frame_up[3] == 'get_graph_reference': 
     raise requests.exceptions.RequestException 
    return original_get(*args, **kwargs) 

requests.get = plotly_no_get 
import plotly 

यह निश्चित रूप से एक पूर्ण समाधान नहीं है लेकिन, अगर और कुछ नहीं, यह पता चलता है कि plot.ly वर्तमान में होना नहीं है पूरी तरह से ऑफ़लाइन चलाएं।

0

मैं किसी भी व्यापक परीक्षण नहीं किया है, लेकिन ऐसा लगता है Plot.ly एक "ऑफ़लाइन" मोड प्रदान करता है जैसे:

https://plot.ly/python/offline/

एक साधारण उदाहरण:

from plotly.offline import plot 
from plotly.graph_objs import Scatter 

plot([Scatter(x=[1, 2, 3], y=[3, 1, 6])]) 

आप स्थापित कर सकते हैं भूखंड।pip के माध्यम से ly और फिर ऊपर स्क्रिप्ट एक स्थिर HTML फ़ाइल बनाने के लिए चलाने: जब मैं चलाने के इस टर्मिनल से अपने वेब ब्राउज़र निम्न फ़ाइल यूआरएल के लिए खुल जाता है

$ pip install plotly 
$ python ./above_script.py 

:

file:///some/path/to/temp-plot.html 

यह एक परस्पर प्रभाव renders ग्राफ जो आपके फाइल सिस्टम के लिए पूरी तरह से स्थानीय है।

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