I tried 2to3 on my python-ptrace project and with minor changes, it works fine. One of the minor changes is to replace subprocess.split(";") by commands.split(";"). The original code was: commands = command ok = True for command in commands.split(";"): command = command.strip() ok &= self.execute(command) I don't import subprocess and I don't use this module in my code. It is possible to reproduce the bug only with two lines: commands = "a;b;c" x = commands.split(";") So 2to3 doesn't care if commands is a module or variable, it just replaced the text pattern... It looks like the change is done by "fixes/fix_imports.py", maybe this pattern: # Find usages of module members in code e.g. urllib.foo(bar) yield """power< (%s) trailer<'.' any > any* > """ % mod_name_list
Victor: that's a common problem in most fixers. The analysis needed to statically determine whether a given identifier is a module or not is expensive and heuristic. One of our Summer of Code students has been working on adding a new feature to 2to3 whereby fixers can apply confidence estimates to the changes they make, allowing you to say "if 2to3 is 95+% confident, apply the fix, otherwise, let me see a diff first". This could be theoretically extended to allow other annotations, such as "changing an identifier", which you could filter on.