How To Automatically Convert Python 2.X Code To Python 3.X Code

With the release of Python 3. x and the discontinuation of support for Python 2. x, many developers face an important task: converting their Python 2. x code into Python 3. x code. Although this task may seem cumbersome and time-consuming, fortunately, there are some automated tools that can help us complete this task. In this blog post, I will introduce several commonly used methods to help you automatically convert Python 2. x code to Python 3. x code.

1. Use Python 2to3 Library Tool.

  1. Python officially provides a tool called 2to3, specifically designed to convert Python 2. x code into Python 3. x code. The Python 2to3 tool can automatically detect and convert incompatible syntax and function calls in source code. The following are simple steps to use the 2to3 tool.
  2. Open a command line window and enter the Python 2 runtime environment. Run the command pip show 2to3. If the following message is displayed, it indicates that the 2to3 package has not been installed yet.
    (python-2-7-18) songs-MacBook-Pro:~ songzhao$ pip show 2to3
    DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7. More details about Python 2 support in pip, can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support
    WARNING: Package(s) not found: 2to3
  3. Run the following command from the command line: ‘pip install 2to3‘ to install the Python 2to3 tool.
    (python-2-7-18) songs-MacBook-Pro:~ songzhao$ pip install 2to3
    DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7. More details about Python 2 support in pip, can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support
    Collecting 2cto3
      Downloading https://files.pythonhosted.org/packages/70/06/9bd891a16b16572e42d124627048a673f9e201c490ef1638b689a94cacd7/2to3-1.0.tar.gz
    Building wheels for collected packages: 2to3
      Building wheel for 2to3 (setup.py) ... done
      Created wheel for 2to3: filename=2to3-1.0-cp27-none-any.whl size=1665 sha256=ffdb8ba84dfdea416d07cd714657f5077387e2587c99d22a0513eecf9c64d932
      Stored in directory: /Users/songzhao/Library/Caches/pip/wheels/b7/d3/5f/c8c64fb009f1c7ef72d2533821dbf329a728400ccb463a41c6
    Successfully built 2to3
    Installing collected packages: 2to3
    Successfully installed 2to3-1.0
  4. Run the command pip show 2to3 again. If you see the following message, it indicates that the Python 2to3 tool has been successfully installed.
    (python-2-7-18) songs-MacBook-Pro:~ songzhao$ pip show 2to3
    DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7. More details about Python 2 support in pip, can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support
    Name: 2to3
    Version: 1.0
    Summary: Adds the 2to3 command directly to entry_points.
    Home-page: UNKNOWN
    Author: xoviat
    Author-email: [email protected]
    License: MIT
    Location: /Users/songzhao/anaconda3/envs/python-2-7-18/lib/python2.7/site-packages
    Requires: 
    Required-by:
  5. Switch to the directory containing the Python 2. x code files on the command line and run the following command: 2to3 -W -n -o converted_ code/ original_code/.
  6. The above command will convert all the source python files in original_code folder to python3.x format and save the converted files in the folder converted_code.
  7. The flag -W or –write-unchanged-files indicate that the 2to3 tool generates and writes output files, regardless of whether any changes are needed to the source file.
  8. The flag -n means no backups, it will not write backups for modified files.
  9. The flag -o or –output-dir is used to specify the folder where the converted output python3.x files are saved in.
  10. The -n and -o flags must be used together at the same time, otherwise it will show errors like below.
    (python-2-7-18) songs-MacBook-Pro:python-2to3-convertion songzhao$ 2to3 -W -o ./converted-code/ ./pythoncode.py
    WARNING: --write-unchanged-files/-W implies -w.
    Usage: 2to3 [options] file|dir ...
    
    2to3: error: Can't use --output-dir/-o without -n.
  11. You can run the command 2to3 –help to list all the flags meanings.
    (python-2-7-18) songs-MacBook-Pro:python-2to3-convertion songzhao$ 2to3 --help
    Usage: 2to3 [options] file|dir ...
    
    Options:
      -h, --help            show this help message and exit
      -d, --doctests_only   Fix up doctests only
      -f FIX, --fix=FIX     Each FIX specifies a transformation; default: all
      -j PROCESSES, --processes=PROCESSES
                            Run 2to3 concurrently
      -x NOFIX, --nofix=NOFIX
                            Prevent a transformation from being run
      -l, --list-fixes      List available transformations
      -p, --print-function  Modify the grammar so that print() is a function
      -v, --verbose         More verbose logging
      --no-diffs            Don't show diffs of the refactoring
      -w, --write           Write back modified files
      -n, --nobackups       Don't write backups for modified files
      -o OUTPUT_DIR, --output-dir=OUTPUT_DIR
                            Put output files in this directory instead of
                            overwriting the input files.  Requires -n.
      -W, --write-unchanged-files
                            Also write files even if no changes were required
                            (useful with --output-dir); implies -w.
      --add-suffix=ADD_SUFFIX
                            Append this string to all output filenames. Requires
                            -n if non-empty.  ex: --add-suffix='3' will generate
                            .py3 files.
    

2. Example Of Converting Python 2 Source Code To Python 3 Source Code Using The 2to3 Tool.

  1. The following is the Python 2.7 source code We can run the following code line by line in the Python 2.7 environment.
    # Python 2.x example source code.
    print "Hello, World!"
    
    name = raw_input("Input your name: ")
    
    print "You are welcome ", name
    
    x = input("Enter a number: ")
    
    print "The square of", x, "is", x ** 2
  2. Save the above code in the pythoncode.py file in the current directory.
  3. Run the command 2to3 -W -n -o ./converted-code/ ./pythoncode.py in the command line console window.
    (python-2-7-18) songs-MacBook-Pro:python-2to3-convertion songzhao$ 2to3 -W -n -o ./converted-code/ ./pythoncode.py
    WARNING: --write-unchanged-files/-W implies -w.
    lib2to3.main: Output in './converted-code/' will mirror the input directory '.' layout.
    RefactoringTool: Skipping optional fixer: buffer
    RefactoringTool: Skipping optional fixer: idioms
    RefactoringTool: Skipping optional fixer: set_literal
    RefactoringTool: Skipping optional fixer: ws_comma
    RefactoringTool: Refactored ./pythoncode.py
    --- ./pythoncode.py	(original)
    +++ ./pythoncode.py	(refactored)
    @@ -1,10 +1,10 @@
     # Python 2.x example source code.
    -print "Hello, World!"
    +print("Hello, World!")
     
    -name = raw_input("Input your name: ")
    +name = input("Input your name: ")
     
    -print "You are welcome ", name
    +print("You are welcome ", name)
     
    -x = input("Enter a number: ")
    +x = eval(input("Enter a number: "))
     
    -print "The square of", x, "is", x ** 2
    +print("The square of", x, "is", x ** 2)
    RefactoringTool: Writing converted ./pythoncode.py to ./converted-code/pythoncode.py.
    RefactoringTool: Files that were modified:
    RefactoringTool: ./pythoncode.py
  4. After the above command is completed, a converted Python 3 source code file will be generated in the converted-code subdirectory of the current directory。
  5. The following is the content of the automatically converted Python 3 source code file.
    # Converted Python 3. x sample code
    print("Hello, World!")
    
    name = input("Input your name: ")
    
    print("You are welcome ", name)
    
    x = eval(input("Enter a number: "))
    
    print("The square of", x, "is", x ** 2)

3. Summary.

  1. Choosing to use the 2To3 tool to automatically convert Python 2. x code to Python 3. x code is very simple. However, automation tools are not perfect, and the converted code may require further manual modifications and adjustments to ensure it runs correctly in the Python 3. x environment. Therefore, it is recommended to conduct sufficient testing and debugging after the conversion is completed.
  2. Converting Python 2. x code to Python 3. x code is an important migration process, but by using these automated tools, you can greatly reduce the workload and achieve faster migration. At the same time, this is also a great opportunity to learn new features and syntax, as Python 3. x introduces many improvements and new features. I hope this blog is helpful for you in the Python code migration process.

Leave a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.