src/eric7/SystemUtilities/PythonUtilities.py

branch
eric7
changeset 9624
b47dfa7a137d
child 9653
e67609152c5e
diff -r 9c1f429cb56b -r b47dfa7a137d src/eric7/SystemUtilities/PythonUtilities.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/eric7/SystemUtilities/PythonUtilities.py	Sun Dec 18 19:33:46 2022 +0100
@@ -0,0 +1,137 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2022 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing Python related utility functions.
+"""
+
+import os
+import sys
+import sysconfig
+
+
+def getPythonExecutable():
+    """
+    Function to determine the path of the (non-windowed) Python executable.
+
+    @return path of the Python executable
+    @rtype str
+    """
+    if sys.platform.startswith("linux"):
+        return sys.executable
+    elif sys.platform == "darwin":
+        return sys.executable.replace("pythonw", "python")
+    else:
+        return sys.executable.replace("pythonw.exe", "python.exe")
+
+
+def getPythonLibraryDirectory():
+    """
+    Function to determine the path to Python's library directory.
+
+    @return path to the Python library directory
+    @rtype str
+    """
+    return sysconfig.get_path("platlib")
+
+
+def getPythonScriptsDirectory():
+    """
+    Function to determine the path to Python's scripts directory.
+
+    @return path to the Python scripts directory
+    @rtype str
+    """
+    return sysconfig.get_path("scripts")
+
+
+def getPythonLibPath():
+    """
+    Function to determine the path to Python's library.
+
+    @return path to the Python library (string)
+    """
+    return sysconfig.get_path("platstdlib")
+
+
+def getPythonVersion():
+    """
+    Function to get the Python version (major, minor) as an integer value.
+
+    @return An integer representing major and minor version number (integer)
+    """
+    return sys.hexversion >> 16
+
+
+def determinePythonVersion(filename, source, editor=None):
+    """
+    Function to determine the python version of a given file.
+
+    @param filename name of the file with extension (str)
+    @param source of the file (str)
+    @param editor reference to the editor, if the file is opened
+        already (Editor object)
+    @return Python version if file is Python3 (int)
+    """
+    from eric7 import Preferences, Utilities
+    from eric7.EricWidgets.EricApplication import ericApp
+
+    pyAssignment = {
+        "Python3": 3,
+        "MicroPython": 3,
+        "Cython": 3,
+    }
+
+    if not editor:
+        viewManager = ericApp().getObject("ViewManager")
+        editor = viewManager.getOpenEditor(filename)
+
+    # Maybe the user has changed the language
+    if editor and editor.getFileType() in pyAssignment:
+        return pyAssignment[editor.getFileType()]
+
+    pyVer = 0
+    if filename:
+        if not source:
+            source = Utilities.readEncodedFile(filename)[0]
+        flags = Utilities.extractFlags(source)
+        ext = os.path.splitext(filename)[1]
+        py3Ext = Preferences.getPython("Python3Extensions")
+        project = ericApp().getObject("Project")
+        basename = os.path.basename(filename)
+
+        if "FileType" in flags:
+            pyVer = pyAssignment.get(flags["FileType"], 0)
+        elif project.isOpen() and project.isProjectFile(filename):
+            language = project.getEditorLexerAssoc(basename)
+            if not language:
+                language = Preferences.getEditorLexerAssoc(basename)
+            if language == "Python3":
+                pyVer = pyAssignment[language]
+
+        if pyVer:
+            # Skip the next tests
+            pass
+        elif (
+            Preferences.getProject("DeterminePyFromProject")
+            and project.isOpen()
+            and project.isProjectFile(filename)
+            and ext in py3Ext
+        ):
+            pyVer = pyAssignment.get(project.getProjectLanguage(), 0)
+        elif ext in py3Ext:
+            pyVer = 3
+        elif source:
+            if isinstance(source, str):
+                line0 = source.splitlines()[0]
+            else:
+                line0 = source[0]
+            if line0.startswith("#!") and (("python3" in line0) or ("python" in line0)):
+                pyVer = 3
+
+        if pyVer == 0 and ext in py3Ext:
+            pyVer = 3
+
+    return pyVer

eric ide

mercurial