V14 Upgrade Errors compiling Python files

Hello, while upgrading Frappe to V14 I am experiencing the following error:

Compiling Python files...
*** Error compiling '/home/system/frappe-bench/apps/frappe/.github/helper/translation.py'...
  File "/home/system/frappe-bench/apps/frappe/.github/helper/translation.py", line 23
    if start_matches := start_pattern.search(line):
                      ^
SyntaxError: invalid syntax

*** Error compiling '/home/system/frappe-bench/apps/frappe/frappe/__init__.py'...
  File "/home/system/frappe-bench/apps/frappe/frappe/__init__.py", line 1090
    if key := can_cache_doc(args):
            ^
SyntaxError: invalid syntax

*** Error compiling '/home/system/frappe-bench/apps/frappe/frappe/app.py'...
  File "/home/system/frappe-bench/apps/frappe/frappe/app.py", line 187
    (allowed_origins := frappe.conf.allow_cors)
                     ^
SyntaxError: invalid syntax

*** Error compiling '/home/system/frappe-bench/apps/frappe/frappe/core/doctype/comment/comment.py'...
  File "/home/system/frappe-bench/apps/frappe/frappe/core/doctype/comment/comment.py", line 168
    if route := frappe.get_cached_value(reference_doctype, reference_name, "route"):
              ^
SyntaxError: invalid syntax

*** Error compiling '/home/system/frappe-bench/apps/frappe/frappe/core/doctype/communication/mixins.py'...
  File "/home/system/frappe-bench/apps/frappe/frappe/core/doctype/communication/mixins.py", line 76
    if (doc_owner := self.get_owner()) not in frappe.STANDARD_USERS:
                  ^
SyntaxError: invalid syntax

*** Error compiling '/home/system/frappe-bench/apps/frappe/frappe/core/doctype/rq_job/rq_job.py'...
  File "/home/system/frappe-bench/apps/frappe/frappe/core/doctype/rq_job/rq_job.py", line 121
    if matches := re.match(r"<function (?P<func_name>.*) at 0x.*>", job_name):
                ^
SyntaxError: invalid syntax

*** Error compiling '/home/system/frappe-bench/apps/frappe/frappe/core/page/permission_manager/permission_manager.py'...
  File "/home/system/frappe-bench/apps/frappe/frappe/core/page/permission_manager/permission_manager.py", line 101
    if meta := frappe.get_meta(d.parent):
             ^
SyntaxError: invalid syntax

*** Error compiling '/home/system/frappe-bench/apps/frappe/frappe/custom/doctype/custom_field/custom_field.py'...
  File "/home/system/frappe-bench/apps/frappe/frappe/custom/doctype/custom_field/custom_field.py", line 66
    and (doc_before_save := self.get_doc_before_save())
                         ^
SyntaxError: invalid syntax

*** Error compiling '/home/system/frappe-bench/apps/frappe/frappe/database/database.py'...
  File "/home/system/frappe-bench/apps/frappe/frappe/database/database.py", line 691
    if df := meta.get_field(fieldname):
           ^
SyntaxError: invalid syntax

*** Error compiling '/home/system/frappe-bench/apps/frappe/frappe/database/query.py'...
  File "/home/system/frappe-bench/apps/frappe/frappe/database/query.py", line 254
    if ordby := ordby.strip():
              ^
SyntaxError: invalid syntax

*** Error compiling '/home/system/frappe-bench/apps/frappe/frappe/database/schema.py'...
  File "/home/system/frappe-bench/apps/frappe/frappe/database/schema.py", line 310
    if special_characters := SPECIAL_CHAR_PATTERN.findall(n):
                           ^
SyntaxError: invalid syntax

*** Error compiling '/home/system/frappe-bench/apps/frappe/frappe/email/__init__.py'...
  File "/home/system/frappe-bench/apps/frappe/frappe/email/__init__.py", line 16
    if cached_contacts := get_cached_contacts(txt):
                        ^
SyntaxError: invalid syntax

*** Error compiling '/home/system/frappe-bench/apps/frappe/frappe/integrations/google_oauth.py'...
  File "/home/system/frappe-bench/apps/frappe/frappe/integrations/google_oauth.py", line 183
    if (domain := state.pop("domain")) in _DOMAIN_CALLBACK_METHODS:
               ^
SyntaxError: invalid syntax

*** Error compiling '/home/system/frappe-bench/apps/frappe/frappe/model/base_document.py'...
  File "/home/system/frappe-bench/apps/frappe/frappe/model/base_document.py", line 117
    if not (meta := getattr(self, "_meta", None)):
                 ^
SyntaxError: invalid syntax

*** Error compiling '/home/system/frappe-bench/apps/frappe/frappe/model/db_query.py'...
  File "/home/system/frappe-bench/apps/frappe/frappe/model/db_query.py", line 985
    elif match := FUNC_IFNULL_PATTERN.search(**kwargs):
                ^
SyntaxError: invalid syntax

*** Error compiling '/home/system/frappe-bench/apps/frappe/frappe/model/document.py'...
  File "/home/system/frappe-bench/apps/frappe/frappe/model/document.py", line 911
    if value := self.get(df.fieldname):
              ^
SyntaxError: invalid syntax

*** Error compiling '/home/system/frappe-bench/apps/frappe/frappe/model/rename_doc.py'...
  File "<fstring>", line 1
    (obj=)
        ^
SyntaxError: invalid syntax

*** Error compiling '/home/system/frappe-bench/apps/frappe/frappe/modules/utils.py'...
  File "/home/system/frappe-bench/apps/frappe/frappe/modules/utils.py", line 218
    if module_name := doctype_module_map.get(doctype):
                    ^
SyntaxError: invalid syntax

*** Error compiling '/home/system/frappe-bench/apps/frappe/frappe/permissions.py'...
  File "/home/system/frappe-bench/apps/frappe/frappe/permissions.py", line 720
    and (permlevel := parent_meta.get_field(child_doc.parentfield).permlevel) > 0
                   ^
SyntaxError: invalid syntax

*** Error compiling '/home/system/frappe-bench/apps/frappe/frappe/twofactor.py'...
  File "/home/system/frappe-bench/apps/frappe/frappe/twofactor.py", line 137
    if otp_secret := get_default(user + "_otpsecret"):
                   ^
SyntaxError: invalid syntax

*** Error compiling '/home/system/frappe-bench/apps/frappe/frappe/utils/__init__.py'...
  File "/home/system/frappe-bench/apps/frappe/frappe/utils/__init__.py", line 106
    if valid_number := is_valid_number(parse(phone_number)):
                     ^
SyntaxError: invalid syntax

*** Error compiling '/home/system/frappe-bench/apps/frappe/frappe/utils/boilerplate.py'...
  File "/home/system/frappe-bench/apps/frappe/frappe/utils/boilerplate.py", line 63
    if validator_function := config.get("validator"):
                           ^
SyntaxError: invalid syntax

*** Error compiling '/home/system/frappe-bench/apps/frappe/frappe/utils/response.py'...
  File "/home/system/frappe-bench/apps/frappe/frappe/utils/response.py", line 229
    if can_access := file.is_downloadable():
                   ^
SyntaxError: invalid syntax

*** Error compiling '/home/system/frappe-bench/apps/frappe/frappe/website/doctype/website_settings/website_settings.py'...
  File "/home/system/frappe-bench/apps/frappe/frappe/website/doctype/website_settings/website_settings.py", line 143
    if setting_value := settings.get(k):
                      ^
SyntaxError: invalid syntax

*** Error compiling '/home/system/frappe-bench/apps/frappe/frappe/website/doctype/website_theme/website_theme.py'...
  File "/home/system/frappe-bench/apps/frappe/frappe/website/doctype/website_theme/website_theme.py", line 136
    if website_theme := frappe.get_website_settings("website_theme"):
                      ^
SyntaxError: invalid syntax

*** Error compiling '/home/system/frappe-bench/apps/frappe/frappe/workflow/doctype/workflow_action/workflow_action.py'...
  File "/home/system/frappe-bench/apps/frappe/frappe/workflow/doctype/workflow_action/workflow_action.py", line 199
    if workflow_action := get_workflow_action_by_role(doc, allowed_roles):
                        ^
SyntaxError: invalid syntax

________________________________________________________________________________
1 Like

Hi,

It may help to say the operating environment and the commands that were used that led to the error message.

What does python3 -V return?

Hello,

I am using Debian GNU/Linux 11 and this was after running bench update --reset

python3 -V returns:

~/frappe-bench$ python3 -v
import _frozen_importlib # frozen
import _imp # builtin
import '_thread' # <class '_frozen_importlib.BuiltinImporter'>
import '_warnings' # <class '_frozen_importlib.BuiltinImporter'>
import '_weakref' # <class '_frozen_importlib.BuiltinImporter'>
import '_frozen_importlib_external' # <class '_frozen_importlib.FrozenImporter'>
import 'posix' # <class '_frozen_importlib.BuiltinImporter'>
import '_io' # <class '_frozen_importlib.BuiltinImporter'>
import 'marshal' # <class '_frozen_importlib.BuiltinImporter'>
# installing zipimport hook
import 'time' # <class '_frozen_importlib.BuiltinImporter'>
import 'zipimport' # <class '_frozen_importlib.FrozenImporter'>
# installed zipimport hook
# /usr/lib/python3.9/encodings/__pycache__/__init__.cpython-39.pyc matches /usr/lib/python3.9/encodings/__init__.py
# code object from '/usr/lib/python3.9/encodings/__pycache__/__init__.cpython-39.pyc'
# /usr/lib/python3.9/__pycache__/codecs.cpython-39.pyc matches /usr/lib/python3.9/codecs.py
# code object from '/usr/lib/python3.9/__pycache__/codecs.cpython-39.pyc'
import '_codecs' # <class '_frozen_importlib.BuiltinImporter'>
import 'codecs' # <_frozen_importlib_external.SourceFileLoader object at 0x7fa2093fcd60>
# /usr/lib/python3.9/encodings/__pycache__/aliases.cpython-39.pyc matches /usr/lib/python3.9/encodings/aliases.py
# code object from '/usr/lib/python3.9/encodings/__pycache__/aliases.cpython-39.pyc'
import 'encodings.aliases' # <_frozen_importlib_external.SourceFileLoader object at 0x7fa20939f340>
import 'encodings' # <_frozen_importlib_external.SourceFileLoader object at 0x7fa2093fcb50>
# /usr/lib/python3.9/encodings/__pycache__/utf_8.cpython-39.pyc matches /usr/lib/python3.9/encodings/utf_8.py
# code object from '/usr/lib/python3.9/encodings/__pycache__/utf_8.cpython-39.pyc'
import 'encodings.utf_8' # <_frozen_importlib_external.SourceFileLoader object at 0x7fa2093fca90>
import '_signal' # <class '_frozen_importlib.BuiltinImporter'>
# /usr/lib/python3.9/encodings/__pycache__/latin_1.cpython-39.pyc matches /usr/lib/python3.9/encodings/latin_1.py
# code object from '/usr/lib/python3.9/encodings/__pycache__/latin_1.cpython-39.pyc'
import 'encodings.latin_1' # <_frozen_importlib_external.SourceFileLoader object at 0x7fa20939f430>
# /usr/lib/python3.9/__pycache__/io.cpython-39.pyc matches /usr/lib/python3.9/io.py
# code object from '/usr/lib/python3.9/__pycache__/io.cpython-39.pyc'
# /usr/lib/python3.9/__pycache__/abc.cpython-39.pyc matches /usr/lib/python3.9/abc.py
# code object from '/usr/lib/python3.9/__pycache__/abc.cpython-39.pyc'
import '_abc' # <class '_frozen_importlib.BuiltinImporter'>
import 'abc' # <_frozen_importlib_external.SourceFileLoader object at 0x7fa20939f8e0>
import 'io' # <_frozen_importlib_external.SourceFileLoader object at 0x7fa20939f610>
# /usr/lib/python3.9/__pycache__/site.cpython-39.pyc matches /usr/lib/python3.9/site.py
# code object from '/usr/lib/python3.9/__pycache__/site.cpython-39.pyc'
# /usr/lib/python3.9/__pycache__/os.cpython-39.pyc matches /usr/lib/python3.9/os.py
# code object from '/usr/lib/python3.9/__pycache__/os.cpython-39.pyc'
# /usr/lib/python3.9/__pycache__/stat.cpython-39.pyc matches /usr/lib/python3.9/stat.py
# code object from '/usr/lib/python3.9/__pycache__/stat.cpython-39.pyc'
import '_stat' # <class '_frozen_importlib.BuiltinImporter'>
import 'stat' # <_frozen_importlib_external.SourceFileLoader object at 0x7fa209356190>
# /usr/lib/python3.9/__pycache__/_collections_abc.cpython-39.pyc matches /usr/lib/python3.9/_collections_abc.py
# code object from '/usr/lib/python3.9/__pycache__/_collections_abc.cpython-39.pyc'
import '_collections_abc' # <_frozen_importlib_external.SourceFileLoader object at 0x7fa209356220>
# /usr/lib/python3.9/__pycache__/posixpath.cpython-39.pyc matches /usr/lib/python3.9/posixpath.py
# code object from '/usr/lib/python3.9/__pycache__/posixpath.cpython-39.pyc'
# /usr/lib/python3.9/__pycache__/genericpath.cpython-39.pyc matches /usr/lib/python3.9/genericpath.py
# code object from '/usr/lib/python3.9/__pycache__/genericpath.cpython-39.pyc'
import 'genericpath' # <_frozen_importlib_external.SourceFileLoader object at 0x7fa20937d850>
import 'posixpath' # <_frozen_importlib_external.SourceFileLoader object at 0x7fa209356940>
import 'os' # <_frozen_importlib_external.SourceFileLoader object at 0x7fa2093b6880>
# /usr/lib/python3.9/__pycache__/_sitebuiltins.cpython-39.pyc matches /usr/lib/python3.9/_sitebuiltins.py
# code object from '/usr/lib/python3.9/__pycache__/_sitebuiltins.cpython-39.pyc'
import '_sitebuiltins' # <_frozen_importlib_external.SourceFileLoader object at 0x7fa20934dd90>
# /usr/lib/python3.9/__pycache__/sitecustomize.cpython-39.pyc matches /usr/lib/python3.9/sitecustomize.py
# code object from '/usr/lib/python3.9/__pycache__/sitecustomize.cpython-39.pyc'
import 'sitecustomize' # <_frozen_importlib_external.SourceFileLoader object at 0x7fa20937deb0>
import 'site' # <_frozen_importlib_external.SourceFileLoader object at 0x7fa20939f910>
Python 3.9.2 (default, Feb 28 2021, 17:03:44)
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
# extension module 'readline' loaded from '/usr/lib/python3.9/lib-dynload/readline.cpython-39-x86_64-linux-gnu.so'
# extension module 'readline' executed from '/usr/lib/python3.9/lib-dynload/readline.cpython-39-x86_64-linux-gnu.so'
import 'readline' # <_frozen_importlib_external.ExtensionFileLoader object at 0x7fa20937dee0>
import 'atexit' # <class '_frozen_importlib.BuiltinImporter'>
# /usr/lib/python3.9/__pycache__/rlcompleter.cpython-39.pyc matches /usr/lib/python3.9/rlcompleter.py
# code object from '/usr/lib/python3.9/__pycache__/rlcompleter.cpython-39.pyc'
import 'rlcompleter' # <_frozen_importlib_external.SourceFileLoader object at 0x7fa20937dfd0>
>>>

I believe python3.10 is the preferred version for 14. Try upgrading to that and bench migrate-env python3.10.

1 Like

I’m on debian 10 (buster), let me elaborate:
You also have to edit the bench-script to use python3.10 as interpreter, or you will get the same SyntaxErrors when running “bench update”.

> which python3.10
/usr/local/bin/python3.10
> which bench
/usr/local/bin/bench
> sudo nano /usr/local/bin/bench
Change
#!/usr/bin/python3
To
#!/usr/local/bin/python3.10

Forgot to mention:
You have to install the bench-application also in python3.10:
pip3.10 install --upgrade frappe-bench

After changig the bench-script to python3.10 you have to use pip3.10 to when upgrading the bench-application to a new version:
pip3.10 install --upgrade frappe-bench