Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Exception ignored in: <function ApiClient.__del__ at 0x105540900> #203

Open
nick-youngblut opened this issue Jan 6, 2025 · 2 comments
Open

Comments

@nick-youngblut
Copy link

My code:

import os
import sys
import json
import datetime
from typing import List, Optional
import datetime
import asana

class AsanaReader():
    """Asana reader. Reads data from an Asana workspace.
    Args:
        asana_token (str): Asana token.
    """

    def __init__(self, asana_token: str=None) -> None:
        """Initialize Asana reader."""
        config = asana.Configuration()
        config.access_token = asana_token
        self.client = asana.ApiClient(config) 

    def load_data(
            self, 
            workspace_gid: Optional[str] = None, 
            project_gid: Optional[str] = None,
            modified_since: Optional[str] = (datetime.datetime.now() - datetime.timedelta(days=7)).isoformat(),
        ) -> List[str]:
        """Load data from the workspace.
        Args:
            workspace_id (Optional[str], optional): Workspace ID.
            project_id (Optional[str], optional): Project ID.
            modified_since: Optional[str], optional): Only return tasks modified since this date.
        """
        # check for valid input
        if workspace_gid is None and project_gid is None:
            raise ValueError("Either workspace_id or project_id must be provided")
        if workspace_gid is not None and project_gid is not None:
            raise ValueError("Only one of workspace_id or project_id should be provided")

        # Case: Only workspace_id is provided
        if workspace_gid is not None:
            projects = self.get_projects(workspace_gid)  
        elif project_gid is not None: 
            projects = [self.get_project(project_gid)]
        else:
            raise ValueError("Invalid input")

    def get_projects(self, workspace_gid: str) -> List[str]:
        opts = {
            'workspace': workspace_gid,
            'archived': False,
            'opt_fields': "name,workspace"
        }
        projects_api_instance = asana.ProjectsApi(self.client)
        api_response = projects_api_instance.get_projects(opts)
        return [data for data in api_response]

    def get_project(self, project_gid: str) -> List[str]:
        opts = {
            'archived': False,
            'opt_fields': "name,workspace"
        }
        projects_api_instance = asana.ProjectsApi(self.client)
        api_response = projects_api_instance.get_project(project_gid, opts)
        return api_response


# main
if __name__ == "__main__":
    from dotenv import load_dotenv
    load_dotenv()

    reader = AsanaReader(asana_token=os.getenv("ASANA_PROD_API_KEY"))
    data = reader.load_data(
        project_gid=os.getenv("ASANA_PROJECT_GID")
    )
    print(data)

The warning:

Exception ignored in: <function ApiClient.__del__ at 0x105330900>
Traceback (most recent call last):
  File "/Users/nickyoungblut/mambaforge/envs/weaviate-db-tools/lib/python3.11/site-packages/asana/api_client.py", line 95, in __del__
  File "/Users/nickyoungblut/mambaforge/envs/weaviate-db-tools/lib/python3.11/multiprocessing/pool.py", line 648, in close
AttributeError: 'NoneType' object has no attribute 'debug'
Exception ignored in: <function Pool.__del__ at 0x104d1d1c0>
Traceback (most recent call last):
  File "/Users/nickyoungblut/mambaforge/envs/weaviate-db-tools/lib/python3.11/multiprocessing/pool.py", line 271, in __del__
  File "/Users/nickyoungblut/mambaforge/envs/weaviate-db-tools/lib/python3.11/multiprocessing/queues.py", line 371, in put
AttributeError: 'NoneType' object has no attribute 'dumps'

My conda env:

# Name                    Version                   Build  Channel
aiohappyeyeballs          2.4.4                    pypi_0    pypi
aiohttp                   3.11.11                  pypi_0    pypi
aiosignal                 1.3.2                    pypi_0    pypi
annotated-types           0.7.0                    pypi_0    pypi
anyio                     4.7.0                    pypi_0    pypi
appnope                   0.1.4              pyhd8ed1ab_1    conda-forge
asana                     5.0.10                   pypi_0    pypi
asttokens                 3.0.0              pyhd8ed1ab_1    conda-forge
attrs                     24.3.0                   pypi_0    pypi
authlib                   1.3.1                    pypi_0    pypi
bzip2                     1.0.8                h99b78c6_7    conda-forge
ca-certificates           2024.12.14           hf0a4a13_0    conda-forge
certifi                   2024.12.14               pypi_0    pypi
cffi                      1.17.1                   pypi_0    pypi
charset-normalizer        3.4.1                    pypi_0    pypi
comm                      0.2.2              pyhd8ed1ab_1    conda-forge
cryptography              44.0.0                   pypi_0    pypi
dataclasses-json          0.6.7                    pypi_0    pypi
debugpy                   1.8.11          py311h155a34a_0    conda-forge
decorator                 5.1.1              pyhd8ed1ab_1    conda-forge
dill                      0.3.9                    pypi_0    pypi
distro                    1.9.0                    pypi_0    pypi
exceptiongroup            1.2.2              pyhd8ed1ab_1    conda-forge
executing                 2.1.0              pyhd8ed1ab_1    conda-forge
frozenlist                1.5.0                    pypi_0    pypi
grpcio                    1.68.1                   pypi_0    pypi
grpcio-health-checking    1.68.1                   pypi_0    pypi
grpcio-tools              1.68.1                   pypi_0    pypi
h11                       0.14.0                   pypi_0    pypi
httpcore                  1.0.7                    pypi_0    pypi
httpx                     0.27.0                   pypi_0    pypi
httpx-sse                 0.4.0                    pypi_0    pypi
idna                      3.10                     pypi_0    pypi
importlib-metadata        8.5.0              pyha770c72_1    conda-forge
ipykernel                 6.29.5             pyh57ce528_0    conda-forge
ipython                   8.31.0             pyh707e725_0    conda-forge
jedi                      0.19.2             pyhd8ed1ab_1    conda-forge
jiter                     0.8.2                    pypi_0    pypi
jsonpatch                 1.33                     pypi_0    pypi
jsonpointer               3.0.0                    pypi_0    pypi
jupyter_client            8.6.3              pyhd8ed1ab_1    conda-forge
jupyter_core              5.7.2              pyh31011fe_1    conda-forge
krb5                      1.21.3               h237132a_0    conda-forge
langchain                 0.3.13                   pypi_0    pypi
langchain-community       0.3.13                   pypi_0    pypi
langchain-core            0.3.28                   pypi_0    pypi
langchain-openai          0.2.14                   pypi_0    pypi
langchain-text-splitters  0.3.4                    pypi_0    pypi
langchain-weaviate        0.0.3                    pypi_0    pypi
langchainhub              0.1.21                   pypi_0    pypi
langsmith                 0.2.7                    pypi_0    pypi
libcxx                    19.1.6               ha82da77_1    conda-forge
libedit                   3.1.20191231         hc8eb9b7_2    conda-forge
libexpat                  2.6.4                h286801f_0    conda-forge
libffi                    3.4.2                h3422bc3_5    conda-forge
liblzma                   5.6.3                h39f12f2_1    conda-forge
libsodium                 1.0.20               h99b78c6_0    conda-forge
libsqlite                 3.47.2               h3f77e49_0    conda-forge
libzlib                   1.3.1                h8359307_2    conda-forge
marshmallow               3.23.2                   pypi_0    pypi
matplotlib-inline         0.1.7              pyhd8ed1ab_1    conda-forge
mpire                     2.10.2                   pypi_0    pypi
multidict                 6.1.0                    pypi_0    pypi
multiprocess              0.70.17                  pypi_0    pypi
mypy-extensions           1.0.0                    pypi_0    pypi
ncurses                   6.5                  h7bae524_1    conda-forge
nest-asyncio              1.6.0              pyhd8ed1ab_1    conda-forge
notion-client             2.3.0                    pypi_0    pypi
numpy                     1.26.4                   pypi_0    pypi
openai                    1.58.1                   pypi_0    pypi
openssl                   3.4.0                h39f12f2_0    conda-forge
orjson                    3.10.13                  pypi_0    pypi
packaging                 24.2               pyhd8ed1ab_2    conda-forge
pandas                    2.2.3                    pypi_0    pypi
parso                     0.8.4              pyhd8ed1ab_1    conda-forge
pexpect                   4.9.0              pyhd8ed1ab_1    conda-forge
pickleshare               0.7.5           pyhd8ed1ab_1004    conda-forge
pip                       24.3.1             pyh8b19718_2    conda-forge
platformdirs              4.3.6              pyhd8ed1ab_1    conda-forge
prompt-toolkit            3.0.48             pyha770c72_1    conda-forge
propcache                 0.2.1                    pypi_0    pypi
protobuf                  5.29.2                   pypi_0    pypi
psutil                    6.1.1           py311h917b07b_0    conda-forge
ptyprocess                0.7.0              pyhd8ed1ab_1    conda-forge
pure_eval                 0.2.3              pyhd8ed1ab_1    conda-forge
pycparser                 2.22                     pypi_0    pypi
pydantic                  2.10.4                   pypi_0    pypi
pydantic-core             2.27.2                   pypi_0    pypi
pydantic-settings         2.7.1                    pypi_0    pypi
pygments                  2.18.0             pyhd8ed1ab_1    conda-forge
python                    3.11.11         hc22306f_1_cpython    conda-forge
python-dateutil           2.9.0.post0        pyhff2d567_1    conda-forge
python-dotenv             1.0.1                    pypi_0    pypi
python_abi                3.11                    5_cp311    conda-forge
pytz                      2024.2                   pypi_0    pypi
pyyaml                    6.0.2                    pypi_0    pypi
pyzmq                     26.2.0          py311h730b646_3    conda-forge
readline                  8.2                  h92ec313_1    conda-forge
regex                     2024.11.6                pypi_0    pypi
requests                  2.32.3                   pypi_0    pypi
requests-toolbelt         1.0.0                    pypi_0    pypi
semchunk                  3.0.0                    pypi_0    pypi
setuptools                75.6.0             pyhff2d567_1    conda-forge
simsimd                   4.4.0                    pypi_0    pypi
six                       1.17.0             pyhd8ed1ab_0    conda-forge
sniffio                   1.3.1                    pypi_0    pypi
sqlalchemy                2.0.36                   pypi_0    pypi
stack_data                0.6.3              pyhd8ed1ab_1    conda-forge
tenacity                  9.0.0                    pypi_0    pypi
tiktoken                  0.8.0                    pypi_0    pypi
tk                        8.6.13               h5083fa2_1    conda-forge
tornado                   6.4.2           py311h917b07b_0    conda-forge
tqdm                      4.67.1                   pypi_0    pypi
traitlets                 5.14.3             pyhd8ed1ab_1    conda-forge
types-requests            2.32.0.20241016          pypi_0    pypi
typing-inspect            0.9.0                    pypi_0    pypi
typing_extensions         4.12.2             pyha770c72_1    conda-forge
tzdata                    2024.2                   pypi_0    pypi
urllib3                   2.3.0                    pypi_0    pypi
validators                0.34.0                   pypi_0    pypi
wcwidth                   0.2.13             pyhd8ed1ab_1    conda-forge
weaviate-client           4.8.1                    pypi_0    pypi
weaviate-db-tools         0.1.0                    pypi_0    pypi
wheel                     0.45.1             pyhd8ed1ab_1    conda-forge
yarl                      1.18.3                   pypi_0    pypi
zeromq                    4.3.5                hc1bb282_7    conda-forge
zipp                      3.21.0             pyhd8ed1ab_1    conda-forge
@jv-asana
Copy link
Contributor

jv-asana commented Feb 6, 2025

Hey @nick-youngblut, you probably want to implement a destructor method like __del__ for your class AsanaReader() the client library has it's own destructor https://github.com/Asana/python-asana/blob/master/asana/api_client.py#L93C9-L96

class AsanaReader:
    def __init__(self, asana_token: str=None) -> None:
        """Initialize Asana reader."""
        config = asana.Configuration()
        config.access_token = asana_token
        self.client = asana.ApiClient(config) 

    def __del__(self):
        ...

reader = AsanaReader(asana_token=os.getenv("ASANA_PROD_API_KEY"))
del reader 

@jv-asana
Copy link
Contributor

jv-asana commented Feb 6, 2025

I think a check for self.pool is not None in the destructor would probably also help with your script: https://github.com/Asana/python-asana/blob/master/asana/api_client.py#L93C9-L96

You can add that check in the template that generates the ApiClient code here: https://github.com/Asana/python-asana/blob/master/codegen/templates/api_client.mustache#L88-L91 and send a PR

EX:

def __del__(self):
    # Safeguard the closure of the pool
    if hasattr(self, "pool") and self.pool:
        try:
            self.pool.close()
            self.pool.join()
        except Exception as e:
            # Capture and log any exception that arises during cleanup
            logging.error(f"Error in __del__: {e}")

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

No branches or pull requests

2 participants