aura
aura

Reputation: 543

python3, directory is not correct when import a module in sub-folder

I have a main folder called 'test', the inner structure is:

# folders and files in the main folder 'test'
Desktop\test\use_try.py
Desktop\test\cond\__init__.py   # empty file.
Desktop\test\cond\tryme.py
Desktop\test\db\

Now in the file tryme.py. I want to generate a file in the folder of 'db'

# content in the file of tryme.py
import os

def main():
    cwd = os.getcwd()    # the directory of the folder 'Desktop\test\cond'
    folder_test = cwd[:-4]   # -4 since 'cond' has 4 letters
    folder_db = folder_test + 'db/'  # the directory of folder 'db'

    with open(folder_db + 'db01.txt', 'w') as wfile:
        wfile.writelines(['This is a test.'])

if __name__ == '__main__':
    main()

If I directly run this file, no problem, the file 'db01.txt' is in the folder of 'db'. But if I run the file of use_try.py, it will not work.

# content in the file of use_try.py
from cond import tryme

tryme.main()

The error I got refers to the tryme.py file. In the command of 'with open ...'

FileNotFoundError: [Error 2] No such file or directory: 'Desktop\db\db01.txt'

It seems like the code

'os.getcwd()' 

only refers to the file that calls the tryme.py file, not the tryme.py file itself.

Do you know how to fix it, so that I can use the file use_try.py to generate the 'db01.txt' in the 'db' folder? I am using Python3

Thanks

Upvotes: 0

Views: 246

Answers (2)

Dave X
Dave X

Reputation: 5147

Use absolute filenames from an environment variable, or expect the db/ directory to be a subdirectory of the current working directory.

This behavior is as expected. The current working directory is where you invoke the code from, not where the code is stored.

folder_test = cwd   # assume working directory will have the db/ subdir

or folder_test = os.getEnv('TEST_DIR') # use ${TEST_DIR}/db/

Upvotes: 0

shx2
shx2

Reputation: 64358

Seems like what you need is not the working directory, but the directory of the tryme.py file.

This can be resolved using the __file__ magic:

curdir = os.path.dirname(__file__)

Upvotes: 2

Related Questions