classification
Title: ImportError ImportError: Import by filename, should be deferred until sys.meta_path hooks are processed
Type: behavior Stage:
Components: Interpreter Core Versions: Python 3.2
process
Status: closed Resolution: rejected
Dependencies: Superseder:
Assigned To: Nosy List: Rob Bairos, brett.cannon, eric.araujo, eric.smith, ncoghlan
Priority: normal Keywords:

Created on 2011-11-01 18:02 by Rob Bairos, last changed 2011-11-04 17:47 by Rob Bairos. This issue is now closed.

Messages (4)
msg146799 - (view) Author: Rob Bairos (Rob Bairos) Date: 2011-11-01 18:02
When adding hooks to sys.meta_path, to correctly deal with arbitrarily named non-disk module definitions, module names with slashes should still be processed.

As it stands when executing statements such as:

import my_module_123#/123
or
even
__import__('my_module_123#/123')

the following exception is raised:

ImportError: Import by filename is not supported.

This stops sys.meta_path from handling arbitrarily named modules.

Shouldn't the ImportError be raised *after* the meta_path processing, at which point, its safe to assume the name is a disk name, in which case slashes are relevant?
msg146980 - (view) Author: Brett Cannon (brett.cannon) * (Python committer) Date: 2011-11-03 21:20
This is working as intended. Importers on sys.meta_path should be able to rely on the assumption that the names they are given are syntactically proper module names and not just any random string. You could perform a transform from module name to random string name in an importer or whatever to support some funky naming scheme under the hood. You could also walk sys.meta_path yourself to get around this sanity check, but I see no value in changing import itself to support this use case.
msg146982 - (view) Author: Rob Bairos (Rob Bairos) Date: 2011-11-03 21:36
Why is a module name syntactically improper simply because it contains a slash?  That seems an arbitrary definition, that serves no purpose, except to discourage accidentally specifying a filename.

Module with unusual characters all reach the meta_path stage,
eg:  my,mo*d1?2my##m;o#d13

But as soon as a slash is introduced, a warning that filenames not being supported is thrown.

1) If the issue is that its not syntactically correct, it should state so.
2) If the issue is that its not syntactically correct, the syntax of a module name should be documented to include *,?#  or throw the same exception.
3) Whats the purpose of the 'Import my filename' exception anyhow? Will it not fail soon thereafter at any rate?

This behaviour is definitely inconsistent and arbitrary.
msg147021 - (view) Author: Rob Bairos (Rob Bairos) Date: 2011-11-04 17:47
Yah, thinking about this further, the real error is that sys.meta_path allows processing of names with #,?*  etc.
I can see why this would cause problems, as python names must only be _ and alphanumeric characters.
I'll re-implement this. 
Thanks.
History
Date User Action Args
2011-11-04 17:47:12Rob Bairossetstatus: open -> closed

messages: + msg147021
2011-11-03 21:36:32Rob Bairossetstatus: closed -> open

messages: + msg146982
2011-11-03 21:20:39brett.cannonsetstatus: open -> closed
resolution: rejected
messages: + msg146980
2011-11-03 16:39:04eric.araujosetnosy: + eric.araujo
2011-11-03 02:00:36pitrousetnosy: + brett.cannon, ncoghlan
2011-11-01 20:45:31eric.smithsetnosy: + eric.smith
2011-11-01 18:05:34Rob Bairossettype: behavior
2011-11-01 18:02:26Rob Bairoscreate