How can I manually generate a .pyc file from a .py file

Python

Python Problem Overview


For some reason, I can not depend on Python's "import" statement to generate .pyc file automatically

Is there a way to implement a function as following?

def py_to_pyc(py_filepath, pyc_filepath):
    ...

Python Solutions


Solution 1 - Python

You can use compileall in the terminal. The following command will go recursively into sub directories and make pyc files for all the python files it finds. The compileall module is part of the python standard library, so you don't need to install anything extra to use it. This works exactly the same way for python2 and python3.

python -m compileall .

Solution 2 - Python

You can compile individual files(s) from the command line with:

python -m compileall <file_1>.py <file_n>.py

Solution 3 - Python

It's been a while since I last used Python, but I believe you can use py_compile:

import py_compile
py_compile.compile("file.py")

Solution 4 - Python

I found several ways to compile python scripts into bytecode

  1. Using py_compile in terminal:

    python -m py_compile File1.py File2.py File3.py ...
    

    -m specifies the module(s) name to be compiled.

    Or, for interactive compilation of files

    python -m py_compile -
    File1.py
    File2.py
    File3.py
       .
       .
       .
    
  2. Using py_compile.compile:

    import py_compile
    py_compile.compile('YourFileName.py')
    
  3. Using py_compile.main():

It compiles several files at a time.

    import py_compile
    py_compile.main(['File1.py','File2.py','File3.py'])

The list can grow as long as you wish. Alternatively, you can obviously pass a list of files in main or even file names in command line args.

Or, if you pass ['-'] in main then it can compile files interactively.

  1. Using compileall.compile_dir():

    import compileall
    compileall.compile_dir(direname)
    

It compiles every single Python file present in the supplied directory.

  1. Using compileall.compile_file():

    import compileall
    compileall.compile_file('YourFileName.py')
    

Take a look at the links below:

https://docs.python.org/3/library/py_compile.html

https://docs.python.org/3/library/compileall.html

Solution 5 - Python

I would use compileall. It works nicely both from scripts and from the command line. It's a bit higher level module/tool than the already mentioned py_compile that it also uses internally.

Solution 6 - Python

In python2 you should use:

python -m compileall <pythonic-project-name>

compiles all .py files to .pyc files in a project which contains packages as well as modules.


In python3 you should use:

python3 -m compileall <pythonic-project-name>

compiles all .py files to __pycache__ folders in a project which contains packages as well as modules.

Or with browning from this post:

> You can enforce the same layout of .pyc files in the folders as in > Python2 by using: > > python3 -m compileall -b <pythonic-project-name> > > The option -b triggers the output of .pyc files to their > legacy-locations (i.e. the same as in Python2).

Solution 7 - Python

To match the original question requirements (source path and destination path) the code should be like that:

import py_compile
py_compile.compile(py_filepath, pyc_filepath)

If the input code has errors then the py_compile.PyCompileError exception is raised.

Solution 8 - Python

There are two ways to do this
  1. Command line
  2. Using python program

If you are using command line, use python -m compileall <argument> to compile python code to python binary code. Ex: python -m compileall -x ./*

Or, You can use this code to compile your library into byte-code:

import compileall
import os

lib_path = "your_lib_path"
build_path = "your-dest_path"

compileall.compile_dir(lib_path, force=True, legacy=True)

def moveToNewLocation(cu_path):
	for file in os.listdir(cu_path):
		if os.path.isdir(os.path.join(cu_path, file)):
			compile(os.path.join(cu_path, file))
		elif file.endswith(".pyc"):
			dest = os.path.join(build_path, cu_path ,file)
			os.makedirs(os.path.dirname(dest), exist_ok=True)
			os.rename(os.path.join(cu_path, file), dest)

moveToNewLocation(lib_path)

look at ā˜ž docs.python.org for detailed documentation

Solution 9 - Python

  1. create a new python file in the directory of the file.
  2. type import (the name of the file without the extension)
  3. run the file
  4. open the directory, then find the pycache folder
  5. inside should be your .pyc file

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionzJayView Question on Stackoverflow
Solution 1 - PythonMarwan AlsabbaghView Answer on Stackoverflow
Solution 2 - PythonderrendView Answer on Stackoverflow
Solution 3 - PythonMike BaileyView Answer on Stackoverflow
Solution 4 - PythonAbhishek KashyapView Answer on Stackoverflow
Solution 5 - PythonPekka KlärckView Answer on Stackoverflow
Solution 6 - PythonBenyamin JafariView Answer on Stackoverflow
Solution 7 - PythonababakView Answer on Stackoverflow
Solution 8 - PythonPrashantView Answer on Stackoverflow
Solution 9 - PythonWudfulstanView Answer on Stackoverflow