Search code examples
pythonspyder

countrycode package TypeError: 'module' object is not callable - Error shows wrong temp file: AppData\Local\Temp\ipykernel_


I know this has been asked elsewhere, but none of the solutions seem to be working.

I am trying to call the countrycode package (https://pypi.org/project/countrycode/).

Here is some test code:

from countrycode import countrycode
countrycode(codes=['Algeria', 'United States'], origin='country_name', target='iso3c')

Traceback (most recent call last):

  File "C:\Users\NAME\AppData\Local\Temp\ipykernel_26092\2392981478.py", line 2, in <module>
    countrycode(codes=['Algeria', 'United States'], origin='country_name', target='iso3c')

TypeError: 'module' object is not callable

I see that the module call seems to be pointing at "C:\Users\NAME\AppData\Local\Temp\ipykernel_26092\2392981478.py". When I look for this file on my system, I can't find it.

Searching around I see that some people have had problems with Jupyter notebooks setting the working directory as a temp folder that has a similar path: Current working directory for jupyter notebook sets to temp folder in vscode

I am using Spyder, running it within Anaconda - via which I installed countrycode using pip3.

I can't work out what the issue is. os.getcwd() returns the correct working directory. Further print(countrycode) appears to point to the correct module location: <module 'countrycode.countrycode' from 'C:\\Users\\NAME\\Anaconda3\\lib\\site-packages\\countrycode\\countrycode.py'>. When I look at that countrycode.py file it seems to contain all the correct information.

I am assuming that somewhere some variable got created (in another script nothing here is named countrycode, and I have restarted) that is pointing to the Temp folder. But I can't work out how to make the module call point to the correct place - especially when the print call seems to do so.


Solution

  • It looks like this package is not well supported, and its documentation on PyPI is inaccurate. I was able to get this working by updating the import statement to look one level deeper in the package:

    from countrycode.countrycode import countrycode
    
    print(
      countrycode(
        codes=['Algeria', 'United States'], 
        origin='country_name', target='iso3c'
      )
    )
    

    Unfortunately the GitHub for this package does not appear to still be live, so I cannot provide with certainty further details as to why the additional layer works.