This question has been flagged
11 Replies
140789 Views

How to uninstall a module from command line

Avatar
Discard
Best Answer

Run this command in your shell

python3 odoo-bin shell -d mydb --addons-path=/your/addons/path

Then run this Python script

self.env['ir.module.module'].search([('name', '=', 'crm')]).button_immediate_uninstall()


Avatar
Discard

This is the Best Answer! THANKS

Thank you so much!!!

fantastic idea. Thanks

I am having troubles .. it did not work out at V14

odoo@odoo14:~$ sudo python3 /opt/odoo/odoo-bin shell -d nominatest --addons-path /opt/odoo/addons
Traceback (most recent call last):
File "/opt/odoo/odoo-bin", line 5, in <module>
__import__('pkg_resources').declare_namespace('odoo.addons')
File "/usr/local/lib/python3.9/site-packages/pkg_resources/__init__.py", line 2270, in declare_namespace
path = sys.modules[parent].__path__
KeyError: 'odoo'

Working on Odoo14, but doesnt forgot to restart your server if facing a new error.

Muhammad - you are a techno-magic man.. you found that solution.. awesome.. super awesome.. It works ..

When I try this solution, it display the following error:

Traceback (most recent call last):
File "/opt/odoo17/odoo/./odoo-bin", line 5, in <module>
import odoo
File "/opt/odoo17/odoo/odoo/__init__.py", line 125, in <module>
from . import modules
File "/opt/odoo17/odoo/odoo/modules/__init__.py", line 8, in <module>
from . import db, graph, loading, migration, module, registry, neutralize
File "/opt/odoo17/odoo/odoo/modules/graph.py", line 11, in <module>
import odoo.tools as tools
File "/opt/odoo17/odoo/odoo/tools/__init__.py", line 7, in <module>
from . import pdf
File "/opt/odoo17/odoo/odoo/tools/pdf.py", line 10, in <module>
import PIL
ModuleNotFoundError: No module named 'PIL'

Please, help :(

Best Answer

My stackoverflow answer:

http://stackoverflow.com/questions/21485630/how-to-uninstall-manually-openerp-module/41760541#41760541


There are two ways
    1.Apply the Patch of my pull request:
            https://github.com/odoo/odoo/pull/12373.patch (git apply /home/user/patch_file.patch)
    2.Manually:

  • Go to Terminal > psql db and Execute the query like: update ir_module_module set state='to remove' where name='module_name' and state='installed';

  • Add update_module=True in loading.py before this line > https://github.com/odoo/odoo/blob/10.0/odoo/modules/loading.py#L378

And run the odoo.py or odoo-bin.
This will uninstall the module properly and safely.

Let me know if face any problem.

Avatar
Discard
Best Answer

You can uninstall a module using the XML-RPC API.

Here is the script I use for v7 (it probably works in later version too).

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""Uninstall a module"""

import xmlrpclib
import argparse
import getpass

parser = argparse.ArgumentParser()
# Connection args
parser.add_argument('-d', '--database', help="Use DB as the database name",
                    action='store', metavar='DB', default=getpass.getuser())
parser.add_argument('-u', '--user', help="Use USER as the database user name",
                    action='store', metavar='USER', default='admin')
parser.add_argument('-w', '--password',
                    help="Use PASSWORD as the database password.",
                    action='store', metavar='PASSWORD', default='admin')
parser.add_argument('-s', '--url',
                    help="Point to the web services hosted at URL",
                    action='store', metavar='URL',
                    default='http://localhost:8069')
# Feature args
parser.add_argument('module', help="Uninstall the module MODULE",
                    action='store', metavar='MODULE')

args = vars(parser.parse_args())

# Log in
ws_common = xmlrpclib.ServerProxy(args['url'] + '/xmlrpc/common')
uid = ws_common.login(args['database'], args['user'], args['password'])
print "Logged in to the common web service."
# Get the object proxy
ws_object = xmlrpclib.ServerProxy(args['url'] + '/xmlrpc/object')
print "Connected to the object web service."

# Find the parent location by name
res_ids = ws_object.execute(
    args['database'], uid, args['password'],
    'ir.module.module', 'search', [('name', '=', args['module'])])
if len(res_ids) != 1:
    raise Exception("Search failed")

# Uninstall the module
print "Uninstalling '%s'" % args['module']
ws_object.execute(
    args['database'], uid, args['password'],
    'ir.module.module', "button_immediate_uninstall", res_ids)

print "All done."

Avatar
Discard
Best Answer

It should be possible to uninstall modules programmatically, because then you can script it for automation.

Having to manually log in to a system to perform administrative functions is error prone and tedious for repetitive tasks. In 2014, every GUI operation should have an API command that does the same thing.

I'm scripting an upgrade path for my 6.1 version database and this is making my testing more difficult than it needs to be.

Avatar
Discard

I found a way to do it. Set the state column in ir_module_module for the module to 'to remove' similar to this: psql -c "UPDATE ir_module_module SET state = 'to remove' WHERE name = '';" and then perform a commandline update: openerp-server -u The update will trigger the module removal.

Gratitude. Solved it for me with Odoo 9, given I inserted this patch as step 2A in openerp/modules/loading.py, and then commented the corresponding two lines of code at the top of STEP 5. Of course, be careful everybody.... # 13.0.3.3.11-t11 jrook STEP 2A: Before step 3, setup list of modules to remove later during step 5. # since 'to remove' modules will be loaded during step 3 and will exit step 3 in 'installed' state. cr.execute("SELECT name, id FROM ir_module_module WHERE state=%s", ('to remove',)) modules_to_remove = dict(cr.fetchall())

Try for better indent this time... # 13.0.3.3.11-t11 jrook STEP 2A: Before step 3, setup list of modules to remove later during step 5. # since 'to remove' modules will be loaded during step 3 and will exit step 3 in 'installed' state. cr.execute("SELECT name, id FROM ir_module_module WHERE state=%s", ('to remove',)) modules_to_remove = dict(cr.fetchall())

Whoever did it, I do not see a reason to flag this post, so please explain or leave it as is.

Really great your solution Justin, thanks!

Best Answer

I try in odoo14, To Uninstall Any Module From Terminal - Please Follow those steps:

sudo su postgres

psql db_name

update ir_module_module set state='uninstallable' where name='module_name' and state='installed';


That's it.....Thank you....!!!

Avatar
Discard

Great, thank you for sharing this simple way. This helped me a lot.

Best Answer

You can now do it using odoorpc library.

I've did an example of installation here

https://github.com/maclarensg/odoo_module_install_script,

You probably can modify it to uninstall. 

Avatar
Discard
Best Answer

You can use the patch of the Pull request for your own odoo:

https://github.com/odoo/odoo/pull/12373


Odoo sees this as opening a loophole/vulnerability, so they don't want this feature to be available.

Avatar
Discard

DevendraK i download https://github.com/odoo/odoo/blob/10.0/odoo/modules/loading.py and apply patch directions from https://github.com/odoo/odoo/pull/12373 (april2018) . I am using " --uninstall

module_name" but it does not uninstall the module. do I still have to use

Add update_module=True in loading.py (feb 2017 comment)???

thaks a lot

Best Answer

Very good 👍 ça fonctionne .vous m'avez permis de résoudre un gros problème, thanks thanks thanks

Avatar
Discard
Best Answer

There is no way to uninstall a module from terminal. You can check the possible options by running
./openerp-server --help in terminal.

Avatar
Discard
Best Answer

Hello,

I don't think there is a command line to do that. The only option that is supported as far as i know is the Settings -> Apps -> <the module=""> -> Uninstall. In general uninstall is not smart idea... you need to be extra careful.

Regards, Pavel Pavlov

Avatar
Discard
Best Answer

Hi,

I think there is no way to uninstall module from command line but temporarily you may cut module(the module you want to uninstall) from your addons path. It is not the best way but atleast it will let you know the issue.

Avatar
Discard

This helped me :)