Isn't python program required to have .py extension?

naseeam
naseeam used Ask the Experts™
Bitbake is a python program. Following guide shows how to setup BitBake.
https://a4z.bitbucket.io/docs/BitBake/guide.html

Form Linux command prompt, I invoke bitbake by simply typing bitbake.  Since the location of this program is in PATH variable, bitbake runs. But how does python compiler know it's a python program.  Aren't python programs required to have .py extension?

filename:  bitbake
#!/usr/bin/env python3
# ex:ts=4:sw=4:sts=4:et
# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
#
# Copyright (C) 2003, 2004  Chris Larson
# Copyright (C) 2003, 2004  Phil Blundell
# Copyright (C) 2003 - 2005 Michael 'Mickey' Lauer
# Copyright (C) 2005        Holger Hans Peter Freyther
# Copyright (C) 2005        ROAD GmbH
# Copyright (C) 2006        Richard Purdie
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

import os
import sys

sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(__file__)),
                                'lib'))
try:
    import bb
except RuntimeError as exc:
    sys.exit(str(exc))

from bb import cookerdata
from bb.main import bitbake_main, BitBakeConfigParameters, BBMainException

if sys.getfilesystemencoding() != "utf-8":
    sys.exit("Please use a locale setting which supports UTF-8 (such as LANG=en_US.UTF-8).\nPython can't change the filesystem locale after loading so we need a UTF-8 when Python starts or things won't work.")

__version__ = "1.40.0"

if __name__ == "__main__":
    if __version__ != bb.__version__:
        sys.exit("Bitbake core version and program version mismatch!")
    try:
        
        sys.exit(bitbake_main(BitBakeConfigParameters(sys.argv),
                              cookerdata.CookerConfiguration()))
    except BBMainException as err:
        sys.exit(err)
    except bb.BBHandledException:
        sys.exit(1)
    except Exception:
        import traceback
        traceback.print_exc()
        sys.exit(1)

Open in new window

Comment
Watch Question

Do more with

Expert Office
EXPERT OFFICE® is a registered trademark of EXPERTS EXCHANGE®
Analyst Assistant
This part of the code tells the operating system to use Python3 to run it.
#!/usr/bin/env python3

Open in new window

Author

Commented:
Thank you!
Scott SilvaNetwork Administrator
And technically it is Windows that needs certain extensions to figure out what a file is supposed to do... Linux and Unix like OS's are a bit smarter at this...
nociSoftware Engineer
Distinguished Expert 2018
For Unix/Linux/BSD/...
If the first 2 bytes of a program are:  '#!'  then immediately after it is a program name.
It either absolute as shown above, or relative to the path.
Some other numbers make it an ELF executable, or different binary.
On windows the MZ & PE mechanism for .EXE files has been derived from this two byte marker idea.
The Windows Shell (windows manager) uses filename extensions (.*) as a primary guide.
Apple IOS went more on the track of internalized filetype (part of the filecontents is some marker for it's type).

There is another requirement on a script/program that needs to be run ... it's x (executable) bits need  to be set in the protection mask.
For Windows... Actually, since some version of Python, the Python Launcher for Windows exists. It is installed into the C:\Windows\ directory as py.exe and pyw.exe, and the Python usual extensions are registered to launch the file through that launcher. You can also use it explicitly, and then the file with the source does not need the extension either -- like:
py test

Open in new window

where the test file contains the Python code. The Python Launcher also recognizes #! to launch the prescribed version of Python (if you have more versions installed side-by-side.

Do more with

Expert Office
Submit tech questions to Ask the Experts™ at any time to receive solutions, advice, and new ideas from leading industry professionals.

Start 7-Day Free Trial