faq.html 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  6. <title>6. Frequently Asked Questions &mdash; Py4J</title>
  7. <link rel="stylesheet" href="_static/py4jdoc.css" type="text/css" />
  8. <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
  9. <script type="text/javascript">
  10. var DOCUMENTATION_OPTIONS = {
  11. URL_ROOT: './',
  12. VERSION: '0.8.1',
  13. COLLAPSE_MODINDEX: false,
  14. FILE_SUFFIX: '.html',
  15. HAS_SOURCE: 'true'
  16. };
  17. </script>
  18. <script type="text/javascript" src="_static/jquery.js"></script>
  19. <script type="text/javascript" src="_static/underscore.js"></script>
  20. <script type="text/javascript" src="_static/doctools.js"></script>
  21. <link rel="author" title="About these documents" href="about.html" />
  22. <link rel="top" title="Py4J" href="index.html" />
  23. <link rel="next" title="7. Contributing to Py4J" href="contributing.html" />
  24. <link rel="prev" title="5. Py4J Java API" href="py4j_java.html" />
  25. <script type="text/javascript">
  26. var _gaq = _gaq || [];
  27. _gaq.push(['_setAccount', 'UA-18626179-1']);
  28. _gaq.push(['_trackPageview']);
  29. (function() {
  30. var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
  31. ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
  32. var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  33. })();
  34. </script>
  35. </head>
  36. <body>
  37. <div class="page">
  38. <div class="banner">Py4J - A Bridge between Python and Java</div>
  39. <div class="related">
  40. <h3>Navigation</h3>
  41. <ul>
  42. <li class="right" style="margin-right: 5px">
  43. <a href="genindex.html" title="General Index"
  44. accesskey="I">index</a></li>
  45. <li class="right" >
  46. <a href="py-modindex.html" title="Python Module Index"
  47. >modules</a> |</li>
  48. <li class="right" >
  49. <a href="contributing.html" title="7. Contributing to Py4J"
  50. accesskey="N">next</a> |</li>
  51. <li class="right" >
  52. <a href="py4j_java.html" title="5. Py4J Java API"
  53. accesskey="P">previous</a> |</li>
  54. <li><a href="index.html">Home</a> |</li>
  55. <li><a href="download.html">Download</a> |</li>
  56. <li><a href="contents.html">Doc</a> |</li>
  57. <li><a href="https://blog.py4j.org">Blog</a> |</li>
  58. <li><a href="https://github.com/bartdag/py4j">github</a> |</li>
  59. <li><a href="about.html">About</a> &raquo;</li>
  60. </ul>
  61. </div>
  62. <div class="sphinxsidebar">
  63. <div class="sphinxsidebarwrapper">
  64. <h3><a href="contents.html">On This Page</a></h3>
  65. <ul>
  66. <li><a class="reference internal" href="#">6. Frequently Asked Questions</a><ul>
  67. <li><a class="reference internal" href="#how-to-turn-logging-on-off">6.1. How to turn logging on/off?</a></li>
  68. <li><a class="reference internal" href="#how-to-call-a-constructor">6.2. How to call a constructor?</a></li>
  69. <li><a class="reference internal" href="#how-to-call-a-static-method">6.3. How to call a static method?</a></li>
  70. <li><a class="reference internal" href="#how-to-access-a-field">6.4. How to access a field?</a></li>
  71. <li><a class="reference internal" href="#how-to-import-a-class">6.5. How to import a class?</a></li>
  72. <li><a class="reference internal" href="#how-to-create-an-array">6.6. How to create an array?</a></li>
  73. <li><a class="reference internal" href="#what-ports-are-used-by-py4j">6.7. What ports are used by Py4J?</a></li>
  74. <li><a class="reference internal" href="#is-py4j-thread-safe">6.8. Is Py4J thread-safe?</a></li>
  75. <li><a class="reference internal" href="#how-can-i-use-py4j-with-eclipse">6.9. How can I use Py4J with Eclipse?</a></li>
  76. <li><a class="reference internal" href="#can-i-use-py4j-with-python-3">6.10. Can I use Py4J with Python 3?</a></li>
  77. <li><a class="reference internal" href="#are-there-any-security-concerns-with-py4j">6.11. Are there any security concerns with Py4J?</a></li>
  78. <li><a class="reference internal" href="#i-found-a-bug-how-do-i-report-it">6.12. I found a bug, how do I report it?</a></li>
  79. <li><a class="reference internal" href="#how-can-i-contribute">6.13. How can I contribute?</a></li>
  80. </ul>
  81. </li>
  82. </ul>
  83. <h4>Previous topic</h4>
  84. <p class="topless"><a href="py4j_java.html"
  85. title="previous chapter">5. Py4J Java API</a></p>
  86. <h4>Next topic</h4>
  87. <p class="topless"><a href="contributing.html"
  88. title="next chapter">7. Contributing to Py4J</a></p>
  89. <h3>This Page</h3>
  90. <ul class="this-page-menu">
  91. <li><a href="_sources/faq.txt"
  92. rel="nofollow">Show Source</a></li>
  93. </ul>
  94. <div id="searchbox" style="display: none">
  95. <h3>Quick search</h3>
  96. <form class="search" action="search.html" method="get">
  97. <input type="text" name="q" size="18" />
  98. <input type="submit" value="Go" />
  99. <input type="hidden" name="check_keywords" value="yes" />
  100. <input type="hidden" name="area" value="default" />
  101. </form>
  102. <p class="searchtip" style="font-size: 90%">
  103. Enter search terms or a module, class or function name.
  104. </p>
  105. </div>
  106. <script type="text/javascript">$('#searchbox').show(0);</script>
  107. </div>
  108. </div>
  109. <div class="document">
  110. <div class="documentwrapper">
  111. <div class="bodywrapper">
  112. <div class="body">
  113. <div class="section" id="frequently-asked-questions">
  114. <h1>6. Frequently Asked Questions<a class="headerlink" href="#frequently-asked-questions" title="Permalink to this headline">¶</a></h1>
  115. <div class="contents local topic" id="summary">
  116. <p class="topic-title first">Summary</p>
  117. <ul class="simple">
  118. <li><a class="reference internal" href="#how-to-turn-logging-on-off" id="id3">How to turn logging on/off?</a></li>
  119. <li><a class="reference internal" href="#how-to-call-a-constructor" id="id4">How to call a constructor?</a></li>
  120. <li><a class="reference internal" href="#how-to-call-a-static-method" id="id5">How to call a static method?</a></li>
  121. <li><a class="reference internal" href="#how-to-access-a-field" id="id6">How to access a field?</a></li>
  122. <li><a class="reference internal" href="#how-to-import-a-class" id="id7">How to import a class?</a></li>
  123. <li><a class="reference internal" href="#how-to-create-an-array" id="id8">How to create an array?</a></li>
  124. <li><a class="reference internal" href="#what-ports-are-used-by-py4j" id="id9">What ports are used by Py4J?</a></li>
  125. <li><a class="reference internal" href="#is-py4j-thread-safe" id="id10">Is Py4J thread-safe?</a></li>
  126. <li><a class="reference internal" href="#how-can-i-use-py4j-with-eclipse" id="id11">How can I use Py4J with Eclipse?</a></li>
  127. <li><a class="reference internal" href="#can-i-use-py4j-with-python-3" id="id12">Can I use Py4J with Python 3?</a></li>
  128. <li><a class="reference internal" href="#are-there-any-security-concerns-with-py4j" id="id13">Are there any security concerns with Py4J?</a></li>
  129. <li><a class="reference internal" href="#i-found-a-bug-how-do-i-report-it" id="id14">I found a bug, how do I report it?</a></li>
  130. <li><a class="reference internal" href="#how-can-i-contribute" id="id15">How can I contribute?</a></li>
  131. </ul>
  132. </div>
  133. <div class="section" id="how-to-turn-logging-on-off">
  134. <h2><a class="toc-backref" href="#id3">6.1. How to turn logging on/off?</a><a class="headerlink" href="#how-to-turn-logging-on-off" title="Permalink to this headline">¶</a></h2>
  135. <p>Logging is turned off by default. In Java, simply call
  136. <code class="docutils literal"><span class="pre">GatewayServer.turnLoggingOn()</span></code> or <code class="docutils literal"><span class="pre">GatewayServer.turnLoggingOff()</span></code>.
  137. Py4J-java uses the <code class="docutils literal"><span class="pre">java.util.logging</span></code> framework. To get fined-grained
  138. control over the logging behavior, just obtain a Logger instance by calling
  139. <code class="docutils literal"><span class="pre">Logger.getLogger(&quot;py4j&quot;)</span></code>. You can also look at the <a class="reference external" href="http://docs.oracle.com/javase/6/docs/technotes/guides/logging/overview.html">Java Logging Overview</a>
  140. for more information on this framework.</p>
  141. <p>For example, in Java, you can do:</p>
  142. <div class="highlight-java"><div class="highlight"><pre><span class="n">GatewayServer</span><span class="o">.</span><span class="na">turnLoggingOn</span><span class="o">();</span>
  143. <span class="n">logger</span> <span class="o">=</span> <span class="n">Logger</span><span class="o">.</span><span class="na">getLogger</span><span class="o">(</span><span class="s">&quot;py4j&quot;</span><span class="o">);</span>
  144. <span class="n">logger</span><span class="o">.</span><span class="na">setLevel</span><span class="o">(</span><span class="n">Level</span><span class="o">.</span><span class="na">ALL</span><span class="o">);</span>
  145. </pre></div>
  146. </div>
  147. <p>In Python, logging can be enabled this way:</p>
  148. <div class="highlight-python"><div class="highlight"><pre><span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="s">&quot;py4j&quot;</span><span class="p">)</span>
  149. <span class="n">logger</span><span class="o">.</span><span class="n">setLevel</span><span class="p">(</span><span class="n">logging</span><span class="o">.</span><span class="n">DEBUG</span><span class="p">)</span>
  150. <span class="n">logger</span><span class="o">.</span><span class="n">addHandler</span><span class="p">(</span><span class="n">logging</span><span class="o">.</span><span class="n">StreamHandler</span><span class="p">())</span>
  151. </pre></div>
  152. </div>
  153. <p><strong>Hint:</strong> you can enable/disable Java logging from Python too:</p>
  154. <div class="highlight-python"><div class="highlight"><pre><span class="n">gateway</span><span class="o">.</span><span class="n">jvm</span><span class="o">.</span><span class="n">py4j</span><span class="o">.</span><span class="n">GatewayServer</span><span class="o">.</span><span class="n">turnLoggingOn</span><span class="p">()</span>
  155. </pre></div>
  156. </div>
  157. </div>
  158. <div class="section" id="how-to-call-a-constructor">
  159. <h2><a class="toc-backref" href="#id4">6.2. How to call a constructor?</a><a class="headerlink" href="#how-to-call-a-constructor" title="Permalink to this headline">¶</a></h2>
  160. <p>Use the <code class="docutils literal"><span class="pre">jvm</span></code> member of a gateway followed by the class&#8217;s fully qualified
  161. name. See <a class="reference internal" href="advanced_topics.html#jvm-views"><span>JVM Views</span></a> to learn how to import packages and
  162. avoid typing the fully qualified name of classes:</p>
  163. <div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="n">gateway</span> <span class="o">=</span> <span class="n">JavaGateway</span><span class="p">()</span>
  164. <span class="gp">&gt;&gt;&gt; </span><span class="n">java_list</span> <span class="o">=</span> <span class="n">gateway</span><span class="o">.</span><span class="n">jvm</span><span class="o">.</span><span class="n">java</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">ArrayList</span><span class="p">()</span>
  165. </pre></div>
  166. </div>
  167. </div>
  168. <div class="section" id="how-to-call-a-static-method">
  169. <h2><a class="toc-backref" href="#id5">6.3. How to call a static method?</a><a class="headerlink" href="#how-to-call-a-static-method" title="Permalink to this headline">¶</a></h2>
  170. <p>Use the <code class="docutils literal"><span class="pre">jvm</span></code> member of a gateway followed by the fully qualified name of the
  171. method&#8217;s class. Do the same for static fields.</p>
  172. <div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="n">gateway</span> <span class="o">=</span> <span class="n">JavaGateway</span><span class="p">()</span>
  173. <span class="gp">&gt;&gt;&gt; </span><span class="n">timestamp</span> <span class="o">=</span> <span class="n">gateway</span><span class="o">.</span><span class="n">jvm</span><span class="o">.</span><span class="n">System</span><span class="o">.</span><span class="n">currentTimeMillis</span><span class="p">()</span> <span class="c"># equivalent to jvm.java.lang.System...</span>
  174. </pre></div>
  175. </div>
  176. </div>
  177. <div class="section" id="how-to-access-a-field">
  178. <h2><a class="toc-backref" href="#id6">6.4. How to access a field?</a><a class="headerlink" href="#how-to-access-a-field" title="Permalink to this headline">¶</a></h2>
  179. <p>Use the <a class="reference internal" href="py4j_java_gateway.html#py4j.java_gateway.get_field" title="py4j.java_gateway.get_field"><code class="xref py py-func docutils literal"><span class="pre">get_field</span></code></a> function:</p>
  180. <div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="n">field_value</span> <span class="o">=</span> <span class="n">py4j</span><span class="o">.</span><span class="n">java_gateway</span><span class="o">.</span><span class="n">get_field</span><span class="p">(</span><span class="nb">object</span><span class="p">,</span><span class="s">&#39;public_field&#39;</span><span class="p">)</span>
  181. </pre></div>
  182. </div>
  183. <p>Or you can also set the <a class="reference internal" href="py4j_java_gateway.html#api-gatewayparameters"><span>auto_field</span></a> parameter to
  184. <cite>True</cite> when you create the gateway:</p>
  185. <div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="n">gateway</span> <span class="o">=</span> <span class="n">JavaGateway</span><span class="p">(</span><span class="n">GatewayParameters</span><span class="p">(</span><span class="n">auto_field</span><span class="o">=</span><span class="bp">True</span><span class="p">))</span>
  186. <span class="gp">&gt;&gt;&gt; </span><span class="nb">object</span> <span class="o">=</span> <span class="n">gateway</span><span class="o">.</span><span class="n">entry_point</span><span class="o">.</span><span class="n">getObject</span><span class="p">()</span>
  187. <span class="gp">&gt;&gt;&gt; </span><span class="n">field_value</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="n">public_field</span>
  188. </pre></div>
  189. </div>
  190. </div>
  191. <div class="section" id="how-to-import-a-class">
  192. <h2><a class="toc-backref" href="#id7">6.5. How to import a class?</a><a class="headerlink" href="#how-to-import-a-class" title="Permalink to this headline">¶</a></h2>
  193. <p>As in Java, you can always access any class using its fully qualified name, but
  194. you can also import the fully qualified name to only refer to the simple name
  195. later on:</p>
  196. <div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">py4j.java_gateway</span> <span class="kn">import</span> <span class="n">JavaGateway</span>
  197. <span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">py4j.java_gateway</span> <span class="kn">import</span> <span class="n">java_import</span>
  198. <span class="gp">&gt;&gt;&gt; </span><span class="n">gateway</span> <span class="o">=</span> <span class="n">JavaGateway</span><span class="p">()</span>
  199. <span class="gp">&gt;&gt;&gt; </span><span class="n">jList1</span> <span class="o">=</span> <span class="n">gateway</span><span class="o">.</span><span class="n">jvm</span><span class="o">.</span><span class="n">java</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">ArrayList</span><span class="p">()</span>
  200. <span class="gp">&gt;&gt;&gt; </span><span class="n">java_import</span><span class="p">(</span><span class="n">gateway</span><span class="o">.</span><span class="n">jvm</span><span class="p">,</span><span class="s">&#39;java.util.*&#39;</span><span class="p">)</span>
  201. <span class="gp">&gt;&gt;&gt; </span><span class="n">jList2</span> <span class="o">=</span> <span class="n">gateway</span><span class="o">.</span><span class="n">jvm</span><span class="o">.</span><span class="n">ArrayList</span><span class="p">()</span>
  202. <span class="gp">&gt;&gt;&gt; </span><span class="n">jMap</span> <span class="o">=</span> <span class="n">gateway</span><span class="o">.</span><span class="n">jvm</span><span class="o">.</span><span class="n">HashMap</span><span class="p">()</span>
  203. <span class="gp">&gt;&gt;&gt; </span><span class="n">gateway</span><span class="o">.</span><span class="n">jvm</span><span class="o">.</span><span class="n">java</span><span class="o">.</span><span class="n">lang</span><span class="o">.</span><span class="n">String</span><span class="p">(</span><span class="s">&quot;a&quot;</span><span class="p">)</span>
  204. <span class="go">u&#39;a&#39;</span>
  205. <span class="gp">&gt;&gt;&gt; </span><span class="n">gateway</span><span class="o">.</span><span class="n">jvm</span><span class="o">.</span><span class="n">String</span><span class="p">(</span><span class="s">&quot;a&quot;</span><span class="p">)</span>
  206. <span class="go">u&#39;a&#39;</span>
  207. </pre></div>
  208. </div>
  209. <p>Read how to use <a class="reference internal" href="advanced_topics.html#jvm-views"><span>jvm views</span></a> to make sure that an import
  210. statement only affects the current Python module.</p>
  211. </div>
  212. <div class="section" id="how-to-create-an-array">
  213. <h2><a class="toc-backref" href="#id8">6.6. How to create an array?</a><a class="headerlink" href="#how-to-create-an-array" title="Permalink to this headline">¶</a></h2>
  214. <p>Use the <a class="reference internal" href="py4j_java_gateway.html#py4j.java_gateway.JavaGateway.new_array" title="py4j.java_gateway.JavaGateway.new_array"><code class="xref py py-func docutils literal"><span class="pre">new_array</span></code></a> function:</p>
  215. <div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="n">gateway</span> <span class="o">=</span> <span class="n">JavaGateway</span><span class="p">()</span>
  216. <span class="gp">&gt;&gt;&gt; </span><span class="n">string_class</span> <span class="o">=</span> <span class="n">gateway</span><span class="o">.</span><span class="n">jvm</span><span class="o">.</span><span class="n">String</span>
  217. <span class="gp">&gt;&gt;&gt; </span><span class="n">string_array</span> <span class="o">=</span> <span class="n">gateway</span><span class="o">.</span><span class="n">new_array</span><span class="p">(</span><span class="n">string_class</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
  218. <span class="gp">&gt;&gt;&gt; </span><span class="n">string_array</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="mi">4</span><span class="p">]</span> <span class="o">=</span> <span class="s">&#39;Hello World&#39;</span>
  219. <span class="gp">&gt;&gt;&gt; </span><span class="n">string_array</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="mi">4</span><span class="p">]</span>
  220. <span class="go">u&#39;Hello World&#39;</span>
  221. <span class="gp">&gt;&gt;&gt; </span><span class="n">string_array</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="mi">3</span><span class="p">]</span> <span class="ow">is</span> <span class="bp">None</span>
  222. <span class="go">True</span>
  223. <span class="gp">&gt;&gt;&gt; </span><span class="n">string_array</span><span class="p">[</span><span class="mi">3</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span>
  224. <span class="gt">Traceback (most recent call last):</span>
  225. <span class="c">...</span>
  226. <span class="gr">IndexError</span>: <span class="n">list index out of range</span>
  227. </pre></div>
  228. </div>
  229. </div>
  230. <div class="section" id="what-ports-are-used-by-py4j">
  231. <h2><a class="toc-backref" href="#id9">6.7. What ports are used by Py4J?</a><a class="headerlink" href="#what-ports-are-used-by-py4j" title="Permalink to this headline">¶</a></h2>
  232. <p>Py4J by default uses the TCP port 25333 to communicate from Python to Java and
  233. TCP port 25334 to communicate from Java to Python. It also uses TCP port 25332
  234. for a test echo server (only used by unit tests).</p>
  235. <p>These ports can be customized when creating a <a class="reference internal" href="py4j_java_gateway.html#py4j.java_gateway.JavaGateway" title="py4j.java_gateway.JavaGateway"><code class="xref py py-class docutils literal"><span class="pre">JavaGateway</span></code></a> on the Python side and a GatewayServer on the
  236. Java side.</p>
  237. </div>
  238. <div class="section" id="is-py4j-thread-safe">
  239. <h2><a class="toc-backref" href="#id10">6.8. Is Py4J thread-safe?</a><a class="headerlink" href="#is-py4j-thread-safe" title="Permalink to this headline">¶</a></h2>
  240. <p>The Java component of Py4J is thread-safe, but multiple threads could access
  241. the same entry point. Each gateway connection is executed in is own thread
  242. (e.g., each time a Python thread calls a Java method) so if multiple Python
  243. threads/processes/programs are connected to the same gateway, i.e., the same
  244. address and the same port, multiple threads may call the entry point&#8217;s methods
  245. concurrently.</p>
  246. <p>In the following example, two threads are accessing the same entry point. If
  247. <cite>gateway1</cite> and <cite>gateway2</cite> were created in separate processes, <cite>method1</cite> would
  248. be accessed concurrently.</p>
  249. <div class="highlight-python"><div class="highlight"><pre><span class="c"># ... in Thread One</span>
  250. <span class="n">gateway1</span> <span class="o">=</span> <span class="n">JavaGateway</span><span class="p">()</span> <span class="c"># Thread One is accessing the JVM.</span>
  251. <span class="n">gateway1</span><span class="o">.</span><span class="n">entry_point</span><span class="o">.</span><span class="n">method1</span><span class="p">()</span> <span class="c"># Thread One is calling method1</span>
  252. <span class="c"># ... in Thread Two</span>
  253. <span class="n">gateway2</span> <span class="o">=</span> <span class="n">JavaGateway</span><span class="p">()</span> <span class="c"># Thread Two is accessing the JVM.</span>
  254. <span class="n">gateway2</span><span class="o">.</span><span class="n">entry_point</span><span class="o">.</span><span class="n">method1</span><span class="p">()</span> <span class="c"># Thread Two is calling method1</span>
  255. </pre></div>
  256. </div>
  257. <p>The Python component of Py4J is also thread-safe, except the <a class="reference internal" href="py4j_java_gateway.html#py4j.java_gateway.GatewayClient.close" title="py4j.java_gateway.GatewayClient.close"><code class="xref py py-func docutils literal"><span class="pre">close</span></code></a> function of a
  258. <a class="reference internal" href="py4j_java_gateway.html#py4j.java_gateway.GatewayClient" title="py4j.java_gateway.GatewayClient"><code class="xref py py-class docutils literal"><span class="pre">CommChannelFactory</span></code></a>, which must
  259. not be accessed concurrently with other methods to ensure that all
  260. communication channels are closed. This is a trade-off to avoid accessing a
  261. lock every time a Java method is called on the Python side. This will only be a
  262. problem if attempting to shut down or close a JavaGateway while calling Java
  263. methods on the Python side.</p>
  264. <p>See <a class="reference internal" href="advanced_topics.html#adv-threading"><span>Py4J Threading Model</span></a> for more details.</p>
  265. </div>
  266. <div class="section" id="how-can-i-use-py4j-with-eclipse">
  267. <h2><a class="toc-backref" href="#id11">6.9. How can I use Py4J with Eclipse?</a><a class="headerlink" href="#how-can-i-use-py4j-with-eclipse" title="Permalink to this headline">¶</a></h2>
  268. <p>Because each Eclipse plug-in has its own class loader, a <cite>GatewayServer</cite>
  269. instance started in one plug-in won&#8217;t have access to the other plug-ins <strong>by
  270. default</strong>. You can work around this limitation by adding this line to the
  271. manifest of the plug-in where the GatewayServer resides:</p>
  272. <p><code class="docutils literal"><span class="pre">Eclipse-BuddyPolicy:global</span></code></p>
  273. <p>You can also use the Py4J Eclipse features that starts a default
  274. <cite>GatewayServer</cite> and that allows Python clients to refer to any classes declared
  275. in any plug-in.</p>
  276. <p>See <a class="reference internal" href="advanced_topics.html#eclipse-features"><span>Py4J and Eclipse</span></a> for more details.</p>
  277. </div>
  278. <div class="section" id="can-i-use-py4j-with-python-3">
  279. <h2><a class="toc-backref" href="#id12">6.10. Can I use Py4J with Python 3?</a><a class="headerlink" href="#can-i-use-py4j-with-python-3" title="Permalink to this headline">¶</a></h2>
  280. <p>Yes, thanks to a <a class="reference external" href="https://github.com/bartdag/py4j/commit/36a145671501ed47bc4002af7cab49b490eb6e0b">generous contributor</a>,
  281. Py4J now works with Python 3.</p>
  282. </div>
  283. <div class="section" id="are-there-any-security-concerns-with-py4j">
  284. <h2><a class="toc-backref" href="#id13">6.11. Are there any security concerns with Py4J?</a><a class="headerlink" href="#are-there-any-security-concerns-with-py4j" title="Permalink to this headline">¶</a></h2>
  285. <p>Running a Py4J gateway on a JVM exposes the JVM over the network, which is a
  286. major security concern because a client can use the JVM to run any code (access
  287. files, delete files, write programs and execute them, communicate over the
  288. network, etc.).</p>
  289. <p>By default, Py4J only listens to the IPv4 localhost (127.0.0.1), so if you
  290. trust all users having access to the localhost, the security risks are minimal
  291. because external programs and users do not have access to the localhost by
  292. default on most systems.</p>
  293. <p>If you use Py4J to make a JVM available over the network, you are responsible
  294. for ensuring that (1) only trusted sources can communicate with the JVM and
  295. (2) the privileges of the user running the JVM are properly constrained. This
  296. is usually achieved with a proper firewall configuration, network
  297. segmentation, and security policies configured with selinux or apparmor.</p>
  298. </div>
  299. <div class="section" id="i-found-a-bug-how-do-i-report-it">
  300. <h2><a class="toc-backref" href="#id14">6.12. I found a bug, how do I report it?</a><a class="headerlink" href="#i-found-a-bug-how-do-i-report-it" title="Permalink to this headline">¶</a></h2>
  301. <p>Please report bugs on our <a class="reference external" href="https://github.com/bartdag/py4j/issues">issue tracker</a>.</p>
  302. </div>
  303. <div class="section" id="how-can-i-contribute">
  304. <h2><a class="toc-backref" href="#id15">6.13. How can I contribute?</a><a class="headerlink" href="#how-can-i-contribute" title="Permalink to this headline">¶</a></h2>
  305. <p>There are many ways to contribute to Py4J:</p>
  306. <ul class="simple">
  307. <li><strong>Found a bug or have a feature request?</strong> Fill a detailed <a class="reference external" href="https://github.com/bartdag/py4j/issues">issue report</a>.</li>
  308. <li><strong>Found a typo or have a better way to clarify the documentation?</strong> Write a
  309. comment at the bottom of documentation the page, send a patch on the <a class="reference external" href="https://groups.google.com/a/py4j.org/forum/#!forum/py4j/join">mailing
  310. list</a>,
  311. fill a <a class="reference external" href="https://github.com/bartdag/py4j/issues">bug report</a> or open a pull
  312. request. The source of each documentation page is accessible in the sidebar.
  313. We use <a class="reference external" href="http://docutils.sourceforge.net/docs/user/rst/quickstart.html">ReStructuredText</a></li>
  314. <li><strong>Good at writing Python or Java?</strong> Good news, we could use some help. You
  315. can open a pull request that adds a new feature or that address an <a class="reference external" href="https://github.com/bartdag/py4j/issues">open
  316. issue</a>. For new features, it is
  317. always best to discuss it on the <a class="reference external" href="https://groups.google.com/a/py4j.org/forum/#!forum/py4j/join">mailing list</a> first.
  318. Do not forget to read our <a class="reference internal" href="contributing.html"><em>contribution guidelines</em></a>.</li>
  319. <li><strong>Feeling artistic?</strong> We need a logo. Hop on the <a class="reference external" href="https://groups.google.com/a/py4j.org/forum/#!forum/py4j/join">mailing list</a>.</li>
  320. </ul>
  321. <p>In case of doubt, do not hesitate to contact the founder of the project,
  322. <a class="reference external" href="mailto:barthelemy&#37;&#52;&#48;infobart&#46;com">Barthelemy</a>.</p>
  323. </div>
  324. </div>
  325. </div>
  326. <div class="helpbar">
  327. <h3>Questions/Feedback?</h3>
  328. <ul>
  329. <li>Try the <a href="faq.html">FAQ</a> -- It answers many questions.</li>
  330. <li>Search for information in the <a href="https://groups.google.com/a/py4j.org/forum/#!forum/py4j">archives of the py4j-users mailing list</a>, or <a href="https://groups.google.com/a/py4j.org/forum/#!forum/py4j/join">post a question</a>.</li>
  331. <li>If you notice errors with this documentation, <a href="https://github.com/bartdag/py4j/issues">open a ticket</a> and let us know. Please, only open a ticket for feedback or improvements on the docs. To get help, use the links above!</li>
  332. </ul>
  333. </div>
  334. </div>
  335. </div>
  336. <div class="clearer"></div>
  337. </div>
  338. <div class="related">
  339. <h3>Navigation</h3>
  340. <ul>
  341. <li class="right" style="margin-right: 5px">
  342. <a href="genindex.html" title="General Index"
  343. >index</a></li>
  344. <li class="right" >
  345. <a href="py-modindex.html" title="Python Module Index"
  346. >modules</a> |</li>
  347. <li class="right" >
  348. <a href="contributing.html" title="7. Contributing to Py4J"
  349. >next</a> |</li>
  350. <li class="right" >
  351. <a href="py4j_java.html" title="5. Py4J Java API"
  352. >previous</a> |</li>
  353. <li><a href="index.html">Home</a> |</li>
  354. <li><a href="download.html">Download</a> |</li>
  355. <li><a href="contents.html">Doc</a> |</li>
  356. <li><a href="https://blog.py4j.org">Blog</a> |</li>
  357. <li><a href="https://github.com/bartdag/py4j">github</a> |</li>
  358. <li><a href="about.html">About</a> &raquo;</li>
  359. </ul>
  360. </div>
  361. <div class="footer">
  362. &copy; Copyright 2009-2013, Barthélémy Dagenais.
  363. Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.3.1.
  364. </div>
  365. </div>
  366. </body>
  367. </html>