<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office"><head><!--[if gte mso 9]><xml><o:OfficeDocumentSettings><o:AllowPNG/><o:PixelsPerInch>96</o:PixelsPerInch></o:OfficeDocumentSettings></xml><![endif]--></head><body><div class="ydp3e4702ddyahoo-style-wrap" style="font-family: Helvetica Neue, Helvetica, Arial, sans-serif; font-size: 13px;"><div><div dir="ltr" data-setdir="false">I am trying to be helpful about PYTHONPATH, but I don't understand the question very well. This is a complete guess. Ignore as convenient.<br></div><div dir="ltr" data-setdir="false"><br></div><div dir="ltr" data-setdir="false">It looks to me like Paul wants App1 and App2 to be a root starting-point directories on (or in) the PYTHONPATH and to have another root directory in PYTHONPATH for common stuff, i.e. a library.  I think maybe others are recommending that the parent to all those directories be the directory on the root path. Not sure. Not going to go parse the mail either. If I'm way off, just stop reading. :)<br></div><div dir="ltr" data-setdir="false"><br></div><div dir="ltr" data-setdir="false">If you want the apps to be able to live anywhere with ignorance of each other, then you don't want to use the common parent directory for the PYTHONPATH reference directory?</div><div dir="ltr" data-setdir="false"><br></div><div dir="ltr" data-setdir="false">This code snippet might be useful to think about PYTHONPATH management.</div><div dir="ltr" data-setdir="false"><br></div><div dir="ltr" data-setdir="false"><div>import logging, os.path, sys<br><br># Build paths inside the project like this: os.path.join(BASE_DIR, ...)<br>BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))<br><br># Add project library home for project use.<br>PARENT_DIR = os.path.dirname(BASE_DIR)<br>LIB_HOME = os.path.join(PARENT_DIR, 'lib')<br>sys.path.append(os.path.abspath(LIB_HOME))<br><br># Now safe to do this, but this is not the only reason for LIB_HOME append:<br>from dmorris.utils.logging import ExceptionFormatter<br><br></div><div dir="ltr" data-setdir="false">If you want to check for a directory already in PYTHONPATH, you can test with: <div dir="ltr" data-setdir="false">if LIB_HOME not in sys.path:</div><div dir="ltr" data-setdir="false">   sys.path.append( whatever )</div><div dir="ltr" data-setdir="false"><br></div><div dir="ltr" data-setdir="false">And if you are done with a variable, you can remove it, e.g. 'del LIB_HOME'.</div><div dir="ltr" data-setdir="false"><br></div><div dir="ltr" data-setdir="false">The lib home will either be located relatively (as above) or absolutely, which is easier to code.<br></div><div dir="ltr" data-setdir="false"><br></div><div dir="ltr" data-setdir="false">It's been a year since I programmed in Python. I'm rusty. I don't think I ever used __init__.py, which I think is the old way. There was a chapter, guessing chapter 24, in Mark Lutz, Learning Python, 5th Edition. May or may not be dated to irrelevance. It was old when I borrowed it from the library, but it had aged well. I think this was it: <a href="https://www.oreilly.com/library/view/learning-python-5th/9781449355722/" rel="nofollow" target="_blank" class="enhancr_card_7289482372">Learning Python, 5th Edition</a></div><div><br></div><div id="ydp310295f0enhancr_card_7289482372" class="ydp310295f0yahoo-link-enhancr-card ydp310295f0ymail-preserve-class ydp310295f0ymail-preserve-style" style="max-width: 400px; font-family: Helvetica Neue, Segoe UI, Helvetica, Arial, sans-serif; position: relative;" data-url="https://www.oreilly.com/library/view/learning-python-5th/9781449355722/" data-type="YENHANCER" data-size="MEDIUM" contenteditable="false"><a href="https://www.oreilly.com/library/view/learning-python-5th/9781449355722/" style="text-decoration:none !important;color:#000 !important" class="ydp310295f0yahoo-enhancr-cardlink" rel="nofollow" target="_blank"><table class="ydp310295f0card-wrapper ydp310295f0yahoo-ignore-table" style="max-width:400px" cellspacing="0" cellpadding="0" border="0"><tbody><tr><td width="400"><table class="ydp310295f0card ydp310295f0yahoo-ignore-table" style="max-width:400px;border-width:1px;border-style:solid;border-color:rgb(224, 228, 233);border-radius:2px" width="100%" cellspacing="0" cellpadding="0" border="0"><tbody><tr><td class="ydp310295f0card-primary-image-cell" style="background-color: rgb(0, 0, 0); background-repeat: no-repeat; background-size: cover; position: relative; border-radius: 2px 2px 0px 0px; min-height: 175px;" valign="top" height="175" bgcolor="#000000" background="https://s.yimg.com/lo/api/res/1.2/uKUNhO6sJ88xCAGwmEvt6Q--~A/Zmk9ZmlsbDt3PTQwMDtoPTIwMDthcHBpZD1pZXh0cmFjdA--/https://www.oreilly.com/library/cover/9781449355722/.cf.jpg"><!--[if gte mso 9]><v:rect fill="true" stroke="false" style="width:396px;height:175px;position:absolute;top:0;left:0;"><v:fill type="frame" color="#000000" src="https://s.yimg.com/lo/api/res/1.2/uKUNhO6sJ88xCAGwmEvt6Q--~A/Zmk9ZmlsbDt3PTQwMDtoPTIwMDthcHBpZD1pZXh0cmFjdA--/https://www.oreilly.com/library/cover/9781449355722/.cf.jpg"/></v:rect><![endif]--><table class="ydp310295f0card-overlay-container-table ydp310295f0yahoo-ignore-table" style="width:100%" cellspacing="0" cellpadding="0" border="0"><tbody><tr><td class="ydp310295f0card-overlay-cell" style="background-color: transparent; border-radius: 2px 2px 0px 0px; min-height: 175px;" valign="top" bgcolor="transparent" background="https://s.yimg.com/cv/ae/nq/storm/assets/enhancrV21/1/enhancr_gradient-400x175.png"><!--[if gte mso 9]><v:rect fill="true" stroke="false" style="width:396px;height:175px;position:absolute;top:-18px;left:0;"><v:fill type="pattern" color="#000000" src="https://s.yimg.com/cv/ae/nq/storm/assets/enhancrV21/1/enhancr_gradient-400x175.png"/><v:textbox inset="0,0,20px,0"><![endif]--><table class="ydp310295f0yahoo-ignore-table" style="width: 100%; min-height: 175px;" height="175" border="0"><tbody><tr><td class="ydp310295f0card-richInfo2" style="text-align:left;padding:15px 0 0 15px;vertical-align:top"></td><td class="ydp310295f0card-actions" style="text-align:right;padding:15px 15px 0 0;vertical-align:top"><div class="ydp310295f0card-share-container"></div></td></tr></tbody></table><!--[if gte mso 9]></v:textbox></v:rect><![endif]--></td></tr></tbody></table></td></tr><tr><td><table class="ydp310295f0card-info ydp310295f0yahoo-ignore-table" style="background-color: rgb(255, 255, 255); background-repeat: repeat; background-attachment: scroll; background-image: none; background-size: auto; position: relative; z-index: 2; width: 100%; max-width: 400px; border-radius: 0px 0px 2px 2px; border-top: 1px solid rgb(224, 228, 233);" cellspacing="0" cellpadding="0" border="0" align="center"><tbody><tr><td style="background-color:#ffffff;padding:16px 0 16px 12px;vertical-align:top;border-radius:0 0 0 2px"></td><td style="vertical-align:middle;padding:12px 24px 16px 12px;width:99%;font-family:Helvetica Neue, Segoe UI, Helvetica, Arial, sans-serif;border-radius:0 0 2px 0"><h2 class="ydp310295f0card-title" style="font-size: 14px; line-height: 19px; margin: 0px 0px 6px; font-family: Helvetica Neue, Segoe UI, Helvetica, Arial, sans-serif; color: rgb(38, 40, 42);">Learning Python, 5th Edition</h2><p class="ydp310295f0card-description" style="font-size: 12px; line-height: 16px; margin: 0px; color: rgb(151, 155, 167);">Get a comprehensive, in-depth introduction to the core Python language with this hands-on book. Based on author ...</p></td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></a><div class="loadingSpinnerContainer" style="position: absolute; top: 0px; width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; background-color: rgba(255, 255, 255, 0.3);"><div class="D_F F_n gl_C ab_C H_6MGW o_h"><div class="W_6MGW H_6MGW D_X ah_1PEzoz" data-test-id="loading_indicator"><svg class="W_6MGW H_6MGW ah_Zq6hUs" viewBox="0 0 24 24" width="24" height="24"><path class="cdPFi_n cZ13pKbK_Z2aVTcY cZ1XO2Ji_dRA c2abBOT_EY cZ1vNhDV_rd cZV8aCd_pI ah_14s73" d="M12,22C6.477,22,2,17.523,2,12S6.477,2,12,2"></path><path class="cdPFi_n cZ13pKbK_Z2aVTcY cZ1XO2Ji_dRA c2abBOT_EY cZ1vNhDV_rd cZV8aCd_pI ah_14s73" d="M12,2c5.523,0,10,4.477,10,10s-4.477,10-10,10"></path></svg></div></div></div></div><div>The man is painfully thorough. You will know everything you ever wanted to know about PYTHONPATH if you read that part. If not at your public library, there's always interlibrary loan (in the US). There's always the official python documentation at <a href="https://docs.python.org/3/" rel="nofollow" target="_blank" class="enhancr_card_6991298072">3.8.1rc1 Documentation</a></div><div><br></div><div id="ydp43f91dceenhancr_card_6991298072" class="ydp43f91dceyahoo-link-enhancr-card ydp43f91dceyahoo-link-enhancr-not-allow-cover ydp43f91dceymail-preserve-class ydp43f91dceymail-preserve-style" style="max-width:400px;font-family:Helvetica Neue, Segoe UI, Helvetica, Arial, sans-serif" data-url="https://docs.python.org/3/" data-type="YENHANCER" data-size="MEDIUM" contenteditable="false"><a href="https://docs.python.org/3/" style="text-decoration:none !important;color:#000 !important" class="ydp43f91dceyahoo-enhancr-cardlink" rel="nofollow" target="_blank"><table class="ydp43f91dcecard-wrapper ydp43f91dceyahoo-ignore-table" style="max-width:400px" cellspacing="0" cellpadding="0" border="0"><tbody><tr><td width="400"><table class="ydp43f91dcecard ydp43f91dceyahoo-ignore-table" style="max-width:400px;border-width:1px;border-style:solid;border-color:rgb(224, 228, 233);border-radius:2px" width="100%" cellspacing="0" cellpadding="0" border="0"><tbody><tr><td><table class="ydp43f91dcecard-info ydp43f91dceyahoo-ignore-table" style="background-color: rgb(255, 255, 255); background-repeat: repeat; background-attachment: scroll; background-image: none; background-size: auto; position: relative; z-index: 2; width: 100%; max-width: 400px; border-radius: 0px 0px 2px 2px; border-top: 1px solid rgb(224, 228, 233);" cellspacing="0" cellpadding="0" border="0"><tbody><tr><td style="background-color:#ffffff;padding:16px 0 16px 12px;vertical-align:top;border-radius:0 0 0 2px"></td><td style="vertical-align:middle;padding:12px 24px 16px 12px;width:99%;font-family:Helvetica Neue, Segoe UI, Helvetica, Arial, sans-serif;border-radius:0 0 2px 0"><h2 class="ydp43f91dcecard-title" style="font-size: 14px; line-height: 19px; margin: 0px 0px 6px; font-family: Helvetica Neue, Segoe UI, Helvetica, Arial, sans-serif; color: rgb(38, 40, 42);">3.8.1rc1 Documentation</h2><p class="ydp43f91dcecard-description" style="font-size: 12px; line-height: 16px; margin: 0px; color: rgb(151, 155, 167);"></p></td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></a></div><br><div dir="ltr" data-setdir="false">Dang yahoo replaces by urls. I'm sure there's more documentation out there. Hope this was useful. Pretty inexpensive if not.<br></div><div dir="ltr" data-setdir="false"><br></div><div dir="ltr" data-setdir="false">Good luck!<br></div><div><br></div></div></div><div dir="ltr" data-setdir="false"><br></div><div dir="ltr" data-setdir="false"><br></div><div><br></div><div class="ydp3e4702ddsignature"><div>Douglas Morris<br></div></div></div>
        <div><br></div><div><br></div>
        
        </div><div id="yahoo_quoted_6406270840" class="yahoo_quoted">
            <div style="font-family:'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:13px;color:#26282a;">
                
                <div>
                    On Saturday, December 14, 2019, 2:41:07 PM EST, Paul Marlin <wurfsendungen@biketrain.net> wrote:
                </div>
                <div><br></div>
                <div><br></div>
                <div><div id="yiv1690342912"><div>
    On 12/13/19 3:02 PM, Matthew Brush wrote:<br clear="none">
    <blockquote type="cite">I'm
      not sure exactly what you're going for, but often you will have
      your main script in the top level, and then put common/library
      code in a package directory, with an (often empty) `__init__.py`
      file. Something like this: <br clear="none">
      <br clear="none">
        - py <br clear="none">
          - main.py <br clear="none">
          - common <br clear="none">
            - __init__.py <br clear="none">
            - fun.py <br clear="none">
      <br clear="none">
      If you lay it out like this, it "Just Works" out of the box with
      Geany's execute command for `main.py`, without messing with any
      path variables or anything. <br clear="none">
      <br clear="none">
      If you want to leave it where `main.py` is in a directory that is
      a sibling of your common/library package, you will probably have
      to mess with paths and/or use some kind of relative imports. <br clear="none">
      <br clear="none">
      I don't think your problem is with Geany as much as with trying to
      understand Python's quite complicated import
      mechanisms/rules/conventions. <br clear="none">
    </blockquote>
         Amen<br clear="none">
    <blockquote type="cite"> <br clear="none">
      Hope that helps. <br clear="none">
      <br clear="none">
      Regards, <br clear="none">
      Matthew Brush
    </blockquote>
    <p>============================================</p>
    <p>What I'm looking for is a way to structure multiple python
      applications that all make use of user defined functions (VFP
      jargon perhaps) stored in a python script (this is how I did it
      with multiple PHP apps).<br clear="none">
    </p>
    <p>I followed your suggestion and took the liberty of adding a
      second script, main1.py.  <b>Both worked</b> even without
      __init__.py. <b><br clear="none">
      </b></p>
    <p> - py
      <br clear="none">
          - main.py <br clear="none">
    </p>
    <p>    - main1.py</p>
    <p>    - common 
      <br clear="none">
            - fun.py </p>
    <p>But my problem is that main.py and main1.py really represent
      separate applications each with multiple files.  The only way I
      know of organizing apps is to  place their files in their own
      directory.  So I tried <br clear="none">
    </p>
    <p> - py <br clear="none">
    </p>
    <p>    - app1</p>
    <p>        - main1.py</p>
    <p>    - app2<br clear="none">
    </p>
    <p>        - main2.py</p>
    <p>     - common <br clear="none">
              - fun.py <br clear="none">
    </p>
    <p>Even though this seems to be the same structure as I started with,
      both main1.py and main2.py worked.  So it appears Geany is now
      accepting /home/paul/py as being in the PYTHONPATH.  Since common
      is downstream of that, it works.</p>
    <p>Thank you.</p>
    <p>PS: I'm sure this belongs in a separate thread; but I got cocky
      and tried an alarm clock program that I had written involving a
      tkinter GUI.  It worked fine in Idle; but all I got from Geany was
      a terminal window telling me the exit code was 0.  Using the
      ancient dicotomy of system vs. applcation programing, wouldn't it
      be fair to say all application programs are GUI?</p>
    <p>Paul</p><div class="yiv1690342912yqt6185797022" id="yiv1690342912yqtfd75128"><br clear="none">
    </div><div class="yiv1690342912yqt6185797022" id="yiv1690342912yqtfd76767">
    <blockquote type="cite">_______________________________________________
      <br clear="none">
      Users mailing list
      <br clear="none">
      <a rel="nofollow" shape="rect" class="yiv1690342912moz-txt-link-abbreviated" ymailto="mailto:Users@lists.geany.org" target="_blank" href="mailto:Users@lists.geany.org">Users@lists.geany.org</a>
      <br clear="none">
      <a rel="nofollow" shape="rect" class="yiv1690342912moz-txt-link-freetext" target="_blank" href="https://lists.geany.org/cgi-bin/mailman/listinfo/users">https://lists.geany.org/cgi-bin/mailman/listinfo/users</a>
      <br clear="none">
    </blockquote>
  </div></div></div><div class="yqt6185797022" id="yqtfd06791">_______________________________________________<br clear="none">Users mailing list<br clear="none"><a shape="rect" ymailto="mailto:Users@lists.geany.org" href="mailto:Users@lists.geany.org">Users@lists.geany.org</a><br clear="none"><a shape="rect" href="https://lists.geany.org/cgi-bin/mailman/listinfo/users" target="_blank">https://lists.geany.org/cgi-bin/mailman/listinfo/users</a><br clear="none"></div></div>
            </div>
        </div></body></html>