python - 导入错误:无法导入站点模块及其依赖项:没有名为站点的模块

标签 python windows servlets jython importerror

我正在尝试在 Windows 上运行 jython servlet。我什至无法运行最简单的 HelloWorld.py。我收到以下 500 错误:

message Servlet.init() for servlet [PyServlet] threw exception
 ...
description Le serveur a rencontré une erreur interne qui l''a empêché de satisfaire la requête.
exception
javax.servlet.ServletException: Servlet.init() for servlet [PyServlet] threw exception
 ...
cause mère
ImportError: Cannot import site module and its dependencies: No module named site
Determine if the following attributes are correct:
  * sys.path: ['C:\\apache-tomcat-8.5.24\\webapps\\jython\\WEB-INF\\lib\\Lib', '__classpath__', '__pyclasspath__/']
    This attribute might be including the wrong directories, such as from CPython
  * sys.prefix: C:\apache-tomcat-8.5.24\webapps\jython\WEB-INF\lib
    This attribute is set by the system property python.home, although it can
    be often automatically determined by the location of the Jython jar file

You can use the -S option or python.import.site=false to not import the site module

    org.python.core.Py.ImportError(Py.java:328)
    org.python.core.Py.importSiteIfSelected(Py.java:1563)
    org.python.util.PythonInterpreter.<init>(PythonInterpreter.java:116)
 ...

Jython部署在C:\jython2.7.0

我最基本的 webapp 位于 C:\apache-tomcat-8.5.24\webapps\jython

jython.jar(不是独立的 jar)被复制为 C:\apache-tomcat-8.5.24\webapps\jython\WEB-INF\lib\jython.jar

我的web.xml取自http://www.jython.org/javadoc/org/python/util/PyServlet.html :

<!-- C:\apache-tomcat-8.5.24\webapps\jython\WEB-INF\web.xml -->
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="3.1">
   <servlet> 
        <servlet-name>PyServlet</servlet-name> 
        <servlet-class>org.python.util.PyServlet</servlet-class> 
         <init-param> 
            <param-name>python.home</param-name> 
            <param-value>C:\\jython2.7.0</param-value> 
        </init-param> 
       <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
        <servlet-name>PyServlet</servlet-name> 
        <url-pattern>*.py</url-pattern> 
    </servlet-mapping> 
 </web-app>

错误消息表明,错误的目录包含在 sys.path 中。 python.home 不是从我的初始化参数中获取的(为什么这样?),它是从 jython.jar 的位置猜测的。

PyServlet初始化

我看过the initialization code对于 PyServlet:

@Override
public void init() {
    Properties props = new Properties();
    // Config parameters
    Enumeration<?> e = getInitParameterNames();
    while (e.hasMoreElements()) {
        String name = (String)e.nextElement();
        props.put(name, getInitParameter(name));
    }
     // ...
        init(props, getServletContext());
    }
    reset();
}

/**
 * PyServlet's initialization can be performed as a ServletContextListener or as a regular
 * servlet, and this is the shared init code. If both initializations are used in a single
 * context, the system state initialization code only runs once.
 */
protected static void init(Properties props, ServletContext context) {
    String rootPath = getRootPath(context);
    context.setAttribute(INIT_ATTR, true);
    Properties baseProps = PySystemState.getBaseProperties();
    // Context parameters
    Enumeration<?> e = context.getInitParameterNames();
    while (e.hasMoreElements()) {
        String name = (String)e.nextElement();
        props.put(name, context.getInitParameter(name));
    }
    if (props.getProperty("python.home") == null
            && baseProps.getProperty("python.home") == null) {
        props.put("python.home", rootPath + "WEB-INF" + File.separator + "lib");
    }
    PySystemState.initialize(baseProps, props, new String[0]);
    // ...
    PySystemState.add_classdir(rootPath + "WEB-INF" + File.separator + "classes");
    PySystemState.add_extdir(rootPath + "WEB-INF" + File.separator + "lib", true);
}

我希望将 python.home 初始化参数添加为属性,并且该属性用于构造 sys.path as shown in the JavaDoc !

我错过了什么?

最佳答案

使用 jython-standalone.jar 对我有用。

在 Maven 中:https://mvnrepository.com/artifact/org.python/jython-standalone

pom.xml:

<dependency>
    <groupId>org.python</groupId>
    <artifactId>jython-standalone</artifactId>
    <version>2.7.1</version>
</dependency>

关于python - 导入错误:无法导入站点模块及其依赖项:没有名为站点的模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48215944/

相关文章:

java - 读取用Struts上传的文件

java - Servlet 中的安全 doGet 参数

python - 如何在使用 Python API 创建文件后立即从 Google Vault 导出下载文件?

c++ - 如何在 Visual C++ 中复制文件?

c++ - Windows 打印处理器可以强制假脱机数据类型吗

c - 如何在不使用 C 中的 system() 的情况下清除 win32 cmd 控制台窗口?

python - 如何打开 Python pickle 文件、追加、保存和关闭它?

python - 在特定行和列中替换 csv python 中的特定字符串

Python HTML 表转 JSON

java - SendRedirect 与 Java Servlet 中的转发用例