New submission from Terry J. Reedy:

The purpose of the function is to create a command line for the user 
subprocess. Most of its body:
'''
# Maybe IDLE is installed and is being accessed via sys.path,
# or maybe it's not installed and the idle.py script is being
# run from the IDLE source directory.
del_exitf = idleConf.GetOption('main', 'General', 'delete-exitfunc',
                               default=False, type='bool')
if __name__ == 'idlelib.PyShell':
    command = "__import__('idlelib.run').run.main(%r)" % (del_exitf,)
else:
    command = "__import__('run').main(%r)" % (del_exitf,)
return [sys.executable] + w + ["-c", command, str(self.port)]
'''
Question: is it really important to avoid binding the run module to 'run' in 
the user process? If so, maybe we should use importlib.import_module, as 
'direct use of __import__ is entirely discouraged".

The first command looks 'funny' because of the repetition of 'run'. The reason 
is that __import__('idlelib.run') returns idlelib, not idlelib.run. Perhaps it 
would work to delete .run in the import, or to use importlib.import_module.

The second command incorrectly assumes that if __name__ == '__main__' (the 
alternative to 'idlelib.PyShell'), then the directory containing PyShell and 
run is the current working directory. This is true if PyShell is run from that 
directory, but

F:\Python\dev\py33\PCbuild>python_d -m idlelib.PyShell
F:\Python\dev\py33\PCbuild>python_d ../Lib/idlelib/PyShell.py

both report "ImportError: No module named 'run'" and open a shell window and 
error message box a few seconds later. The shell closes when the messagebox is 
dismissed.

It seems to me that the 'else' caters to a non-existent or impossible use case. 
PyShell has several 'from idlelib.X import Y' statements. If those work, then  
"from idlelib import run' must work, and so too must the function equivalent.

----------
messages: 192053
nosy: roger.serwy, terry.reedy
priority: normal
severity: normal
stage: needs patch
status: open
title: Fix idlelib.PyShell.build_subprocess_arglist  use of __import__
type: behavior
versions: Python 2.7, Python 3.3, Python 3.4

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue18330>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to