mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
Derived from SF patch #446899 Permit import of .pyw under Windows, from
David Bolen.
This commit is contained in:
parent
289898cdbb
commit
c173137391
4 changed files with 72 additions and 50 deletions
|
@ -16,49 +16,56 @@ else:
|
||||||
# Another brief digression to test the accuracy of manifest float constants.
|
# Another brief digression to test the accuracy of manifest float constants.
|
||||||
import double_const # don't blink -- that *was* the test
|
import double_const # don't blink -- that *was* the test
|
||||||
|
|
||||||
|
def test_with_extension(ext): # ext normally ".py"; perhaps ".pyw"
|
||||||
|
source = TESTFN + ext
|
||||||
|
pyo = TESTFN + ".pyo"
|
||||||
|
if sys.platform.startswith('java'):
|
||||||
|
pyc = TESTFN + "$py.class"
|
||||||
|
else:
|
||||||
|
pyc = TESTFN + ".pyc"
|
||||||
|
|
||||||
|
f = open(source, "w")
|
||||||
|
print >> f, "# This tests Python's ability to import a", ext, "file."
|
||||||
|
a = random.randrange(1000)
|
||||||
|
b = random.randrange(1000)
|
||||||
|
print >> f, "a =", a
|
||||||
|
print >> f, "b =", b
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
try:
|
||||||
|
try:
|
||||||
|
mod = __import__(TESTFN)
|
||||||
|
except ImportError, err:
|
||||||
|
raise ValueError("import from %s failed: %s" % (ext, err))
|
||||||
|
|
||||||
|
if mod.a != a or mod.b != b:
|
||||||
|
print a, "!=", mod.a
|
||||||
|
print b, "!=", mod.b
|
||||||
|
raise ValueError("module loaded (%s) but contents invalid" % mod)
|
||||||
|
finally:
|
||||||
|
os.unlink(source)
|
||||||
|
|
||||||
|
try:
|
||||||
|
try:
|
||||||
|
reload(mod)
|
||||||
|
except ImportError, err:
|
||||||
|
raise ValueError("import from .pyc/.pyo failed: %s" % err)
|
||||||
|
finally:
|
||||||
|
try:
|
||||||
|
os.unlink(pyc)
|
||||||
|
except os.error:
|
||||||
|
pass
|
||||||
|
try:
|
||||||
|
os.unlink(pyo)
|
||||||
|
except os.error:
|
||||||
|
pass
|
||||||
|
del sys.modules[TESTFN]
|
||||||
|
|
||||||
sys.path.insert(0, os.curdir)
|
sys.path.insert(0, os.curdir)
|
||||||
|
|
||||||
source = TESTFN + ".py"
|
|
||||||
pyo = TESTFN + ".pyo"
|
|
||||||
if sys.platform.startswith('java'):
|
|
||||||
pyc = TESTFN + "$py.class"
|
|
||||||
else:
|
|
||||||
pyc = TESTFN + ".pyc"
|
|
||||||
|
|
||||||
f = open(source, "w")
|
|
||||||
print >> f, "# This will test Python's ability to import a .py file"
|
|
||||||
a = random.randrange(1000)
|
|
||||||
b = random.randrange(1000)
|
|
||||||
print >> f, "a =", a
|
|
||||||
print >> f, "b =", b
|
|
||||||
f.close()
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
try:
|
test_with_extension(".py")
|
||||||
mod = __import__(TESTFN)
|
if sys.platform.startswith("win"):
|
||||||
except ImportError, err:
|
for ext in ".PY", ".Py", ".pY", ".pyw", ".PYW", ".pYw":
|
||||||
raise ValueError, "import from .py failed: %s" % err
|
test_with_extension(ext)
|
||||||
|
|
||||||
if mod.a != a or mod.b != b:
|
|
||||||
print a, "!=", mod.a
|
|
||||||
print b, "!=", mod.b
|
|
||||||
raise ValueError, "module loaded (%s) but contents invalid" % mod
|
|
||||||
finally:
|
finally:
|
||||||
os.unlink(source)
|
del sys.path[0]
|
||||||
|
|
||||||
try:
|
|
||||||
try:
|
|
||||||
reload(mod)
|
|
||||||
except ImportError, err:
|
|
||||||
raise ValueError, "import from .pyc/.pyo failed: %s" % err
|
|
||||||
finally:
|
|
||||||
try:
|
|
||||||
os.unlink(pyc)
|
|
||||||
except os.error:
|
|
||||||
pass
|
|
||||||
try:
|
|
||||||
os.unlink(pyo)
|
|
||||||
except os.error:
|
|
||||||
pass
|
|
||||||
|
|
||||||
del sys.path[0]
|
|
||||||
|
|
|
@ -42,6 +42,7 @@ Roy Bixler
|
||||||
Pablo Bleyer
|
Pablo Bleyer
|
||||||
Finn Bock
|
Finn Bock
|
||||||
Paul Boddie
|
Paul Boddie
|
||||||
|
David Bolen
|
||||||
Jurjen Bos
|
Jurjen Bos
|
||||||
Peter Bosch
|
Peter Bosch
|
||||||
Eric Bouck
|
Eric Bouck
|
||||||
|
|
|
@ -32,12 +32,17 @@ C API
|
||||||
against buffer overruns.
|
against buffer overruns.
|
||||||
|
|
||||||
- Unicode APIs now use name mangling to assure that mixing interpreters
|
- Unicode APIs now use name mangling to assure that mixing interpreters
|
||||||
and extensions using different Unicode widths is rendered next to
|
and extensions using different Unicode widths is rendered next to
|
||||||
impossible. Trying to import an incompatible Unicode-aware extension
|
impossible. Trying to import an incompatible Unicode-aware extension
|
||||||
will result in an ImportError. Unicode extensions writers must make
|
will result in an ImportError. Unicode extensions writers must make
|
||||||
sure to check the Unicode width compatibility in their extensions by
|
sure to check the Unicode width compatibility in their extensions by
|
||||||
using at least one of the mangled Unicode APIs in the extension.
|
using at least one of the mangled Unicode APIs in the extension.
|
||||||
|
|
||||||
|
Windows
|
||||||
|
|
||||||
|
- "import module" now compiles module.pyw if it exists and nothing else
|
||||||
|
relevant is found.
|
||||||
|
|
||||||
|
|
||||||
What's New in Python 2.2a1?
|
What's New in Python 2.2a1?
|
||||||
===========================
|
===========================
|
||||||
|
|
|
@ -70,6 +70,9 @@ static const struct filedescr _PyImport_StandardFiletab[] = {
|
||||||
#else
|
#else
|
||||||
static const struct filedescr _PyImport_StandardFiletab[] = {
|
static const struct filedescr _PyImport_StandardFiletab[] = {
|
||||||
{".py", "r", PY_SOURCE},
|
{".py", "r", PY_SOURCE},
|
||||||
|
#ifdef MS_WIN32
|
||||||
|
{".pyw", "r", PY_SOURCE},
|
||||||
|
#endif
|
||||||
{".pyc", "rb", PY_COMPILED},
|
{".pyc", "rb", PY_COMPILED},
|
||||||
{0, 0}
|
{0, 0}
|
||||||
};
|
};
|
||||||
|
@ -513,13 +516,19 @@ PyImport_ExecCodeModuleEx(char *name, PyObject *co, char *pathname)
|
||||||
static char *
|
static char *
|
||||||
make_compiled_pathname(char *pathname, char *buf, size_t buflen)
|
make_compiled_pathname(char *pathname, char *buf, size_t buflen)
|
||||||
{
|
{
|
||||||
size_t len;
|
size_t len = strlen(pathname);
|
||||||
|
|
||||||
len = strlen(pathname);
|
|
||||||
if (len+2 > buflen)
|
if (len+2 > buflen)
|
||||||
return NULL;
|
return NULL;
|
||||||
strcpy(buf, pathname);
|
|
||||||
strcpy(buf+len, Py_OptimizeFlag ? "o" : "c");
|
#ifdef MS_WIN32
|
||||||
|
/* Treat .pyw as if it were .py. The case of ".pyw" must match
|
||||||
|
that used in _PyImport_StandardFiletab. */
|
||||||
|
if (len >= 4 && strcmp(&pathname[len-4], ".pyw") == 0)
|
||||||
|
--len; /* pretend 'w' isn't there */
|
||||||
|
#endif
|
||||||
|
memcpy(buf, pathname, len);
|
||||||
|
buf[len] = Py_OptimizeFlag ? 'o' : 'c';
|
||||||
|
buf[len+1] = '\0';
|
||||||
|
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue