{"id":1658,"date":"2023-04-13T21:47:21","date_gmt":"2023-04-13T19:47:21","guid":{"rendered":"https:\/\/alessandromasciadri.com\/?p=1658"},"modified":"2023-04-13T22:09:12","modified_gmt":"2023-04-13T20:09:12","slug":"come-importare-classi-python-da-una-directory-padre","status":"publish","type":"post","link":"https:\/\/alessandromasciadri.com\/come-importare-classi-python-da-una-directory-padre\/","title":{"rendered":"Come importare classi Python da una directory padre"},"content":{"rendered":"\t\t<div data-akihiro-type=\"ama-post\" data-akihiro-id=\"1658\" class=\"akihiro akihiro-1658\" data-akihiro-post-type=\"post\">\n\t\t\t\t<div class=\"akihiro-element akihiro-element-9548162 e-flex e-con-boxed e-con e-parent\" data-id=\"9548162\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"akihiro-element akihiro-element-5c0ea64 akihiro-widget akihiro-widget-text-editor\" data-id=\"5c0ea64\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"akihiro-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>In questa guida vediamo come importare delle classi Python che sono contenute in una parent directory. Referenziare ed importare moduli contenuti in una directory padre non \u00e8 consentito dalla Python 3.3 e successive. Vediamo di affrontare il problema con uno scenario concreto.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"akihiro-element akihiro-element-26d9167 akihiro-widget akihiro-widget-heading\" data-id=\"26d9167\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"akihiro-widget-container\">\n\t\t\t\t\t<h3 class=\"akihiro-heading-title akihiro-size-default\">Scenario<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"akihiro-element akihiro-element-5aaac71 akihiro-widget akihiro-widget-text-editor\" data-id=\"5aaac71\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"akihiro-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Abbiamo la seguente struttura di cartelle e file python:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"akihiro-element akihiro-element-844b786 akihiro-widget akihiro-widget-code-highlight\" data-id=\"844b786\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"akihiro-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language- \">\n\t\t\t\t<code readonly=\"true\" class=\"language-\">\n\t\t\t\t\t<xmp>app\n  -classes\n    -car.py\n    -bike.py\n  -scripts\n    -run.py<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"akihiro-element akihiro-element-bb4c83c akihiro-widget akihiro-widget-text-editor\" data-id=\"bb4c83c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"akihiro-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Dallo script run.py vogliamo importare la classe car.py e bike.py, ma per quanto detto precedentemente, non possibile importare un modulo contenuto in una directory padre o in altra sua sottodirectory, pertanto ci si imbatte in un errore simile a questo:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"akihiro-element akihiro-element-e5f88e7 akihiro-widget akihiro-widget-code-highlight\" data-id=\"e5f88e7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"akihiro-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-okaidia copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language- \">\n\t\t\t\t<code readonly=\"true\" class=\"language-\">\n\t\t\t\t\t<xmp>Traceback (most recent call last):\n  File \"\/app\/scripts\/run.py\", line 6, in <module>\n    from classes.car import *\nModuleNotFoundError: No module named 'classes'<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"akihiro-element akihiro-element-76bccfa akihiro-widget akihiro-widget-heading\" data-id=\"76bccfa\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"akihiro-widget-container\">\n\t\t\t\t\t<h3 class=\"akihiro-heading-title akihiro-size-default\">Soluzione 1: Usare il metodo sys.path<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"akihiro-element akihiro-element-ccb4615 akihiro-widget akihiro-widget-text-editor\" data-id=\"ccb4615\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"akihiro-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>In questo caso utilizziamo il modulo sys ed impostiamo il path che porta al modulo richiesto.<\/p><p>Aggiungiamo il percorso al sys.path utilizzando il metodo append(). Questo metodo viene utilizzato per aggiungere uno specifico percorso da rendere disponibile agli interpreti per le loro ricerche delle classi.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"akihiro-element akihiro-element-0a41f1d akihiro-widget akihiro-widget-code-highlight\" data-id=\"0a41f1d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"akihiro-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-okaidia copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-python \">\n\t\t\t\t<code readonly=\"true\" class=\"language-python\">\n\t\t\t\t\t<xmp>import sys\n\n# setting path\nsys.path.append('\/app\/classes')\n \n# importing\nfrom car import *\nfrom bike import *\n \n# using\nget_car_brand()\nset_bike_model('Ducati')<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"akihiro-element akihiro-element-3e3e296 akihiro-widget akihiro-widget-heading\" data-id=\"3e3e296\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"akihiro-widget-container\">\n\t\t\t\t\t<h3 class=\"akihiro-heading-title akihiro-size-default\">Soluzione 2: Usare il metodo os.path.abspath()<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"akihiro-element akihiro-element-6799c9d akihiro-widget akihiro-widget-text-editor\" data-id=\"6799c9d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"akihiro-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>In questo caso utilizziamo il modulo sys unitamente al modulo path per estrarre la directory contenente le classi da importare e successivamente aggiungerla al path.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"akihiro-element akihiro-element-26d5431 akihiro-widget akihiro-widget-code-highlight\" data-id=\"26d5431\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"akihiro-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-okaidia copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-python \">\n\t\t\t\t<code readonly=\"true\" class=\"language-python\">\n\t\t\t\t\t<xmp>import pathlib\nimport sys\n\n# directory reach\ndirectory = pathlib.Path(__file__).parent.resolve()\n\nprint(directory.parent)\n\n# setting path\nsys.path.append(str(directory.parent) + \"\/classes\")\n\n# importing\nfrom car import *\nfrom bike import *\n\n# using\nget_car_brand()\nset_bike_model('Ducati')<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>In questa guida vediamo come importare delle classi Python che sono contenute in una parent directory. Referenziare ed importare moduli contenuti in una directory padre non \u00e8 consentito dalla Python 3.3 e successive. Vediamo di affrontare il problema con uno scenario concreto. Scenario Abbiamo la seguente struttura di cartelle e file python: app -classes -car.py [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[12],"class_list":["post-1658","post","type-post","status-publish","format-standard","hentry","category-programmazione","tag-python"],"_links":{"self":[{"href":"https:\/\/alessandromasciadri.com\/ama-json\/wp\/v2\/posts\/1658","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/alessandromasciadri.com\/ama-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/alessandromasciadri.com\/ama-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/alessandromasciadri.com\/ama-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/alessandromasciadri.com\/ama-json\/wp\/v2\/comments?post=1658"}],"version-history":[{"count":4,"href":"https:\/\/alessandromasciadri.com\/ama-json\/wp\/v2\/posts\/1658\/revisions"}],"predecessor-version":[{"id":1662,"href":"https:\/\/alessandromasciadri.com\/ama-json\/wp\/v2\/posts\/1658\/revisions\/1662"}],"wp:attachment":[{"href":"https:\/\/alessandromasciadri.com\/ama-json\/wp\/v2\/media?parent=1658"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/alessandromasciadri.com\/ama-json\/wp\/v2\/categories?post=1658"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/alessandromasciadri.com\/ama-json\/wp\/v2\/tags?post=1658"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}