src.org.python.modules._py_compile Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jython-installer Show documentation
Show all versions of jython-installer Show documentation
Jython is an implementation of the high-level, dynamic, object-oriented
language Python written in 100% Pure Java, and seamlessly integrated with
the Java platform. It thus allows you to run Python on any Java platform.
// Copyright (c) Corporation for National Research Initiatives
package org.python.modules;
import java.io.File;
import jnr.constants.platform.Errno;
import org.python.core.Py;
import org.python.core.PyList;
import org.python.core.PyString;
import org.python.core.PySystemState;
public class _py_compile {
public static PyList __all__ = new PyList(new PyString[] { new PyString("compile") });
public static boolean compile(String filename, String cfile, String dfile) {
// Resolve relative path names. dfile is only used for error messages and should not be
// resolved
PySystemState sys = Py.getSystemState();
filename = sys.getPath(filename);
cfile = sys.getPath(cfile);
File file = new File(filename);
if (!file.exists()) {
throw Py.IOError(Errno.ENOENT, Py.newString(filename));
}
String name = getModuleName(file);
byte[] bytes = org.python.core.imp.compileSource(name, file, dfile, cfile);
org.python.core.imp.cacheCompiledSource(filename, cfile, bytes);
return bytes.length > 0;
}
public static final String getModuleName(File f) {
String name = f.getName();
int dot = name.lastIndexOf('.');
if (dot != -1) {
name = name.substring(0, dot);
}
// name the __init__ module after its package
File dir = f.getParentFile();
if (name.equals("__init__")) {
name = dir.getName();
dir = dir.getParentFile();
}
// Make the compiled classfile's name fully qualified with a package by walking up the
// directory tree looking for __init__.py files. Don't check for __init__$py.class since
// we're compiling source here and the existence of a class file without corresponding
// source probably doesn't indicate a package.
while (dir != null && (new File(dir, "__init__.py").exists())) {
name = dir.getName() + "." + name;
dir = dir.getParentFile();
}
return name;
}
}