Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is my script's directory not in the Python sys.path?

Python 3.6.5
I am aware of this one: Why does my python not add current working directory to the path? But the problem there is that he's doing something more complicated (referring to a sub-folder but executing from a main folder). The answers there are to either simplify things or to add package definitions.

And the selected answer even says: "It is the script's directory that is added"

However, my problem is really more simple: My script's directory ISN'T added.

Basically, all the tutorials on the internet say: import mymodule
When I do that, I get a name error...

My folder structure:

C:/Projects/interner
    interner.py   # this is the main program body
    aux.py        # this is the auxiliary file I would like to import into the above

I've tried both coding 'import aux' inside interner.py, and also using the interactive console:

cd c:/Projects/interner
python
import aux

To no avail (ModuleNotFoundError: No module named 'aux')

My sys.path:

['C:\\Tools\\Python\\python365\\python36.zip', 'C:\\Tools\\Python\\python365']

(both from inside the script and from interactive console)

Could you please tell me why I can't import local scripts? Is it because my sys.path is missing the PWD? If so, why is it missing it?

Edit: Doing this to help investigation:

>>> import os; print(os.listdir("."))
['aux.py', 'hw.py', 'interner.py', 'my_funcs.py']
like image 616
Kiichiro Matsushita Avatar asked Jul 18 '18 13:07

Kiichiro Matsushita


People also ask

How do I add a directory to a path in Python?

Clicking on the Environment Variables button o​n the bottom right. In the System variables section, selecting the Path variable and clicking on Edit. The next screen will show all the directories that are currently a part of the PATH variable. Clicking on New and entering Python's install directory.

How do I add path to SYS path?

append(mod_directory) to append the path and then open the python interpreter, the directory mod_directory gets added to the end of the list sys. path. If I export the PYTHONPATH variable before opening the python interpreter, the directory gets added to the start of the list.

Why is Python not finding my module?

This is caused by the fact that the version of Python you're running your script with is not configured to search for modules where you've installed them. This happens when you use the wrong installation of pip to install packages.

Where is my Python working directory?

To find the current working directory in Python, use os. getcwd() , and to change the current working directory, use os. chdir(path) .


2 Answers

I believe this is a Python bug, specific to the embeddable (ZIP file without an installer) Windows distribution. I’ve filed https://bugs.python.org/issue34841.

Removing the python37._pth file (presumably python36._pth in your case) from the distribution fixed it for me.

like image 126
Simon Sapin Avatar answered Oct 18 '22 17:10

Simon Sapin


I don't know why but it seems that "" is missing from your sys.path variable, and that prevents from importing modules from current directory all right!

I can somehow reproduce your issue (eatcpu.py is in my current dir):

$ python.exe
Python 2.7.8 (default, Jun 30 2014, 16:08:48) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', 'C:\\Windows\\system32\\python27.zip', 'D:\\AppX64\\Python27\\DLLs', ... etc...]
>>> import eatcpu

works. Now in another python session:

$ python.exe
Python 2.7.8 (default, Jun 30 2014, 16:08:48) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path.remove("")
>>> import eatcpu
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named eatcpu
>>>

So the quickfix for you is to do:

import sys
sys.path.append("")
like image 44
Jean-François Fabre Avatar answered Oct 18 '22 16:10

Jean-François Fabre