ERPNext Foundation ERPNext Cloud Chat Blog Discuss Frappé* Donate

ERPNext V11, Python 3 or 2.7


#1

Hi, I’m planing to use ERPNext V11 in production server.

Which python is more stable for V11?

Python 2.7 or Python 3


#2

Python 3


#3

Both version are compatible, but if you are looking for the most stable one I would recommend python 2.7 as python 3 will only be the default language for v12 (there has been no requirement to move Bench to python 3 in v11)


#4

Keep this in mind too: Node.js still has Python 2 as a dependency. Until that’s resolved, you’ll need that installed anyway. Even if you’re doing all other development with Python 3.


#5

Internally we are running both 2 and 3 in production. But if you are on V11, you should move to Python 3 to be future ready.


#6

Also note that the automated tests routinely run on both Python 2.7 and 3.6, but also both MariaDB and Postgres.

https://travis-ci.org/frappe

Plus the UI tests now run on Cypress Bringing back UI Tests using Cypress


[SOLVED] Frappe v11 + python3 + Ldap
[v11] Why am I getting a Unicode Error in Production Server but not on my test environment for special characters?
#7

I guess the most straight forward way to be on phyton3 is by running the inital bench init command with the --python-version flag but the way this comment is constructed their seems to be a way to migrate to python3 on existing Frappé/ERPNext instances as well. Can anybody point out the details of such a process?


#8

bench migrate-env python3.6
To go back:
bench migrate-env python2.7
If you like speed at the expense of some compatibility:
bench migrate-env pypy


#9

looks like command needs to be bench migrate-env python3 (where /usr/bin/python3 actually is a symlink to 3.5)

lrwxrwxrwx 1 root root 9 Mar 23 2016 python3 -> python3.5)

getting problems with bench update after the switch to p3 though

DEBUG:bench.commands:Migration Successful to /usr/bin/python3
bench@ubn1604:~/frappe-bench$ bench restart
bench@ubn1604:~/frappe-bench$ bench update
INFO:bench.utils:updating bench
INFO:bench.utils:git pull
remote: Enumerating objects: 17, done.
remote: Counting objects: 100% (17/17), done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 19 (delta 10), reused 8 (delta 8), pack-reused 2
Unpacking objects: 100% (19/19), done.
From https://github.com/frappe/bench
   651856b..97b2891  master     -> origin/master
Updating 651856b..97b2891
Fast-forward
 README.md             |  2 +-
 bench/config/nginx.py | 18 +++++++++++++++++-
 playbooks/install.py  |  5 +++++
 playbooks/site.yml    | 32 ++++++++++++++++----------------
 4 files changed, 39 insertions(+), 18 deletions(-)
remote: Enumerating objects: 162, done.
remote: Counting objects: 100% (162/162), done.
remote: Compressing objects: 100% (14/14), done.
remote: Total 205 (delta 148), reused 152 (delta 148), pack-reused 43
Receiving objects: 100% (205/205), 45.55 KiB | 0 bytes/s, done.
Resolving deltas: 100% (157/157), completed with 86 local objects.
From https://github.com/frappe/frappe
   e9a1ad5..0e5d378  staging    -> upstream/staging
   d5fdc67..1197271  develop    -> upstream/develop
   12798c9..0e5d378  staging-fixes -> upstream/staging-fixes
 * [new tag]         v11.0.3-beta.47 -> v11.0.3-beta.47
INFO:bench.utils:./env/bin/pip install Pillow
Requirement already satisfied: Pillow in ./env/lib/python3.5/site-packages (5.4.0)
INFO:bench.app:pulling frappe
INFO:bench.utils:git pull  upstream staging
From https://github.com/frappe/frappe
 * branch            staging    -> FETCH_HEAD
Updating e9a1ad5..0e5d378
Fast-forward
 frappe/contacts/report/addresses_and_contacts/addresses_and_contacts.py      |  30 +++-----
 frappe/contacts/report/addresses_and_contacts/test_addresses_and_contacts.py | 106 +++++++++++++++++++++++++++++
 frappe/core/doctype/transaction_log/readme.md                                |  16 +++++
 frappe/core/doctype/transaction_log/transaction_log.json                     |   5 +-
 frappe/core/doctype/transaction_log/transaction_log.py                       |   6 +-
 frappe/core/doctype/view_log/test_view_log.js                                |   6 +-
 frappe/core/doctype/view_log/test_view_log.py                                |   4 +-
 frappe/core/doctype/view_log/view_log.js                                     |   2 +-
 frappe/core/doctype/view_log/view_log.json                                   | 291 +++++++++++++++++++++++++++++++++++++++---------------------------------------
 frappe/core/doctype/view_log/view_log.py                                     |   2 +-
 frappe/core/report/transaction_log_report/transaction_log_report.js          |   8 ++-
 frappe/core/report/transaction_log_report/transaction_log_report.json        |   5 +-
 frappe/core/report/transaction_log_report/transaction_log_report.py          |   7 +-
 frappe/desk/form/load.py                                                     |   2 +-
 frappe/hooks.py                                                              |   2 +-
 frappe/integrations/doctype/dropbox_settings/dropbox_settings.json           |   2 +-
 frappe/model/delete_doc.py                                                   |   4 +-
 frappe/model/document.py                                                     |   2 +-
 frappe/patches.txt                                                           |   6 +-
 frappe/patches/v11_0/reload_and_rename_view_log.py                           |  27 ++++++++
 frappe/permissions.py                                                        |   4 +-
 frappe/public/js/frappe/chat.js                                              |   4 +-
 frappe/public/js/frappe/form/footer/timeline.js                              |   2 +-
 frappe/public/js/frappe/views/reports/query_report.js                        |   4 +-
 frappe/tests/test_db_query.py                                                |  30 ++++++++
 frappe/tests/test_naming.py                                                  |  11 +--
 frappe/tests/test_permissions.py                                             |  10 +++
 frappe/website/utils.py                                                      |   2 +
 28 files changed, 400 insertions(+), 200 deletions(-)
 create mode 100644 frappe/contacts/report/addresses_and_contacts/test_addresses_and_contacts.py
 create mode 100644 frappe/core/doctype/transaction_log/readme.md
 create mode 100644 frappe/patches/v11_0/reload_and_rename_view_log.py
INFO:bench.utils:find . -name "*.pyc" -delete
INFO:bench.app:pulling frappe_io
INFO:bench.utils:git pull  upstream master
From https://github.com/frappe/frappe_io
 * branch            master     -> FETCH_HEAD
Already up-to-date.
INFO:bench.utils:find . -name "*.pyc" -delete
INFO:bench.app:pulling erpnext
INFO:bench.utils:git pull  upstream staging
remote: Enumerating objects: 444, done.
remote: Counting objects: 100% (317/317), done.
remote: Compressing objects: 100% (60/60), done.
remote: Total 164 (delta 132), reused 135 (delta 104), pack-reused 0
Receiving objects: 100% (164/164), 25.07 KiB | 0 bytes/s, done.
Resolving deltas: 100% (132/132), completed with 33 local objects.
From https://github.com/frappe/erpnext
 * branch            staging    -> FETCH_HEAD
   1fa3f7d..094d539  staging    -> upstream/staging
Updating 1fa3f7d..094d539
Fast-forward
 erpnext/accounts/report/financial_statements.py                             |   2 +-
 erpnext/accounts/report/sales_payment_summary/sales_payment_summary.py      |  60 ++++++++++++-----------
 erpnext/accounts/report/sales_payment_summary/test_sales_payment_summary.py | 165 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 erpnext/hooks.py                                                            |   2 +-
 erpnext/hr/doctype/department/test_department.py                            |  17 ++++++-
 erpnext/hr/doctype/employee/employee.py                                     |  16 ++++--
 erpnext/hr/doctype/employee/test_employee.py                                |  13 +++++
 erpnext/hr/doctype/leave_application/test_leave_application.py              |   2 +-
 erpnext/hr/doctype/upload_attendance/test_upload_attendance.py              |  33 +++++++++++++
 erpnext/hr/doctype/upload_attendance/upload_attendance.py                   |  33 ++++++++++---
 erpnext/manufacturing/doctype/bom_item/bom_item.json                        | 210 ++++++++++++++++++++++++-------------------------------------------------------
 erpnext/projects/doctype/timesheet/test_timesheet.py                        |   2 +
 erpnext/utilities/transaction_base.py                                       |  14 +++++-
 13 files changed, 376 insertions(+), 193 deletions(-)
 create mode 100644 erpnext/accounts/report/sales_payment_summary/test_sales_payment_summary.py
 create mode 100644 erpnext/hr/doctype/upload_attendance/test_upload_attendance.py
INFO:bench.utils:find . -name "*.pyc" -delete
INFO:bench.app:pulling foundation
INFO:bench.utils:git pull  upstream master
From https://github.com/erpnext/foundation
 * branch            master     -> FETCH_HEAD
Already up-to-date.
INFO:bench.utils:find . -name "*.pyc" -delete
INFO:bench.app:pulling bookingapp
INFO:bench.utils:git pull  upstream master
From https://github.com/jigartarpara/bookingapp
 * branch            master     -> FETCH_HEAD
Already up-to-date.
INFO:bench.utils:find . -name "*.pyc" -delete
Updating Python libraries...
INFO:bench.utils:./env/bin/pip install --upgrade pip
Requirement already up-to-date: pip in ./env/lib/python3.5/site-packages (18.1)
INFO:bench.utils:./env/bin/pip install -q -r /opt/bench/bench-repo/requirements.txt
INFO:bench.utils:./env/bin/pip install -q -r ./apps/frappe/requirements.txt
INFO:bench.utils:./env/bin/pip install -q -r ./apps/frappe_io/requirements.txt
INFO:bench.utils:./env/bin/pip install -q -r ./apps/erpnext/requirements.txt
INFO:bench.utils:./env/bin/pip install -q -r ./apps/foundation/requirements.txt
INFO:bench.utils:./env/bin/pip install -q -r ./apps/bookingapp/requirements.txt
Updating node packages...
INFO:bench.utils:yarn install
yarn install v1.12.3
[1/4] Resolving packages...
success Already up-to-date.
Done in 0.64s.
Backing up sites...
Traceback (most recent call last):
  File "/usr/lib/python3.5/runpy.py", line 184, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.5/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/opt/bench/frappe-bench/apps/frappe/frappe/utils/bench_helper.py", line 97, in <module>
    main()
  File "/opt/bench/frappe-bench/apps/frappe/frappe/utils/bench_helper.py", line 18, in main
    click.Group(commands=commands)(prog_name='bench')
  File "/opt/bench/frappe-bench/env/lib/python3.5/site-packages/click/core.py", line 764, in __call__
    return self.main(*args, **kwargs)
  File "/opt/bench/frappe-bench/env/lib/python3.5/site-packages/click/core.py", line 717, in main
    rv = self.invoke(ctx)
  File "/opt/bench/frappe-bench/env/lib/python3.5/site-packages/click/core.py", line 1137, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/opt/bench/frappe-bench/env/lib/python3.5/site-packages/click/core.py", line 1137, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/opt/bench/frappe-bench/env/lib/python3.5/site-packages/click/core.py", line 956, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/opt/bench/frappe-bench/env/lib/python3.5/site-packages/click/core.py", line 555, in invoke
    return callback(*args, **kwargs)
  File "/opt/bench/frappe-bench/env/lib/python3.5/site-packages/click/decorators.py", line 17, in new_func
    return f(get_current_context(), *args, **kwargs)
  File "/opt/bench/frappe-bench/apps/frappe/frappe/commands/__init__.py", line 25, in _func
    ret = f(frappe._dict(ctx.obj), *args, **kwargs)
  File "/opt/bench/frappe-bench/apps/frappe/frappe/commands/site.py", line 302, in backup
    odb = scheduled_backup(ignore_files=not with_files, backup_path_db=backup_path_db, backup_path_files=backup_path_files, backup_path_private_files=backup_path_private_files, force=True)
  File "/opt/bench/frappe-bench/apps/frappe/frappe/utils/backups.py", line 172, in scheduled_backup
    odb = new_backup(older_than, ignore_files, backup_path_db=backup_path_db, backup_path_files=backup_path_files, force=force)
  File "/opt/bench/frappe-bench/apps/frappe/frappe/utils/backups.py", line 182, in new_backup
    odb.get_backup(older_than, ignore_files, force=force)
  File "/opt/bench/frappe-bench/apps/frappe/frappe/utils/backups.py", line 48, in get_backup
    self.set_backup_file_name()
  File "/opt/bench/frappe-bench/apps/frappe/frappe/utils/backups.py", line 63, in set_backup_file_name
    todays_date = now_datetime().strftime('%Y%m%d_%H%M%S')
  File "/opt/bench/frappe-bench/apps/frappe/frappe/utils/data.py", line 121, in now_datetime
    dt = convert_utc_to_user_timezone(datetime.datetime.utcnow())
  File "/opt/bench/frappe-bench/apps/frappe/frappe/utils/data.py", line 144, in convert_utc_to_user_timezone
    return utcnow.astimezone(timezone(get_time_zone()))
  File "/opt/bench/frappe-bench/apps/frappe/frappe/utils/data.py", line 138, in get_time_zone
    return frappe.cache().get_value("time_zone", _get_time_zone)
  File "/opt/bench/frappe-bench/apps/frappe/frappe/utils/redis_wrapper.py", line 72, in get_value
    val = generator()
  File "/opt/bench/frappe-bench/apps/frappe/frappe/utils/data.py", line 132, in _get_time_zone
    return frappe.db.get_system_setting('time_zone') or 'Asia/Kolkata' # Default to India ?!
  File "/opt/bench/frappe-bench/apps/frappe/frappe/database.py", line 943, in get_system_setting
    return frappe.cache().get_value("system_settings", _load_system_settings).get(key)
  File "/opt/bench/frappe-bench/apps/frappe/frappe/utils/redis_wrapper.py", line 72, in get_value
    val = generator()
  File "/opt/bench/frappe-bench/apps/frappe/frappe/database.py", line 942, in _load_system_settings
    return self.get_singles_dict("System Settings")
  File "/opt/bench/frappe-bench/apps/frappe/frappe/database.py", line 603, in get_singles_dict
    """, doctype)
  File "/opt/bench/frappe-bench/apps/frappe/frappe/database.py", line 165, in sql
    self.connect()
  File "/opt/bench/frappe-bench/apps/frappe/frappe/database.py", line 115, in connect
    charset='utf8mb4', use_unicode = True, conv = conversions, local_infile = self.local_infile)
  File "/opt/bench/frappe-bench/env/lib/python3.5/site-packages/pymysql/__init__.py", line 94, in Connect
    return Connection(*args, **kwargs)
  File "/opt/bench/frappe-bench/env/lib/python3.5/site-packages/pymysql/connections.py", line 325, in __init__
    self.connect()
  File "/opt/bench/frappe-bench/env/lib/python3.5/site-packages/pymysql/connections.py", line 599, in connect
    self._request_authentication()
  File "/opt/bench/frappe-bench/env/lib/python3.5/site-packages/pymysql/connections.py", line 861, in _request_authentication
    auth_packet = self._read_packet()
  File "/opt/bench/frappe-bench/env/lib/python3.5/site-packages/pymysql/connections.py", line 684, in _read_packet
    packet.check_error()
  File "/opt/bench/frappe-bench/env/lib/python3.5/site-packages/pymysql/protocol.py", line 220, in check_error
    err.raise_mysql_exception(self._data)
  File "/opt/bench/frappe-bench/env/lib/python3.5/site-packages/pymysql/err.py", line 109, in raise_mysql_exception
    raise errorclass(errno, errval)
pymysql.err.OperationalError: (1045, "Access denied for user '7a6f4ef655be499a'@'localhost' (using password: YES)")

Any pointer how to get passed this? is this a mariadb access issue for the 7a6f4ef655be499a user? It wasn’t a problem prior the migration.

Also I have one custom app running. can this be the problem?


#10

yea. that was the problem. ran bench uninstall-app bookingapp & bench remove-from-installed-apps bookingapp and all goes well.