question-mark
Stuck on an issue?

Lightrun Answers was designed to reduce the constant googling that comes with debugging 3rd party libraries. It collects links to all the places you might be looking at while hunting down a tough bug.

And, if you’re still stuck at the end, we’re happy to hop on a call to see how we can help out.

Python file with more than one entry breaks module resolution

See original GitHub issue

Environment data

  • VS Code version: Version 1.30.0 (1.30.0)
  • Extension version (available under the Extensions sidebar): 2018.12.1
  • OS and version: Mac OS 10.14.1
  • Python version (& distribution if applicable, e.g. Anaconda): 3.7 cPython
  • Type of virtual environment used (N/A | venv | virtualenv | conda | …): pyenv
  • Relevant/affected Python packages and their versions: None

Expected behaviour

Adding custom locations to .pth file should be resolved by the Python intellisense.

Actual behaviour

I have a custom package that is in a subdirectory of my project. I want Python to resolve it as if it were an installed module.

The project is setup as such. os_path -|± project_dir –|± bin —|± test.py –|± lib —|± custom_module ----|± __init__.py

In the python 3.7 site-packages directory I have a .pth file with something like the following contents. {os_dir}/{project_dir} {os_dir}/{project_dir}/lib

In Python this resolves without issue and so I can do.

Python 3.7.0 (default, Aug 21 2018, 11:16:24) 
[Clang 9.1.0 (clang-902.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import custom_module
>>> custom_module.test()
Hello

If I create a test.py file in the project’s bin directory like so:

"""This is a test."""
import custom_module
custom_module.test()

In VSCode I get unresolved import:

{ “resource”: “/{os_path}/{project_dir}/bin/test.py”, “owner”: “generated_diagnostic_collection_name#0”, “code”: “unresolved-import”, “severity”: 4, “message”: “unresolved import ‘custom_module’”, “source”: “Python”, “startLineNumber”: 2, “startColumn”: 8, “endLineNumber”: 2, “endColumn”: 21 }

If I switch the import to lib.{custom_module} then the module resolution works. I’m guessing this is because VSCode adds the workspace to the PYTHONPATH.

Steps to reproduce:

  1. Setup a project with a module that is +1 level deep in the project. i.e. lib/custom_module/__init__.py
  2. Add a test function for resolution to __init__.py
"""This is a test."""


def test() -> None:
    """This is a test function."""
    print("Hello")

  1. In the Python site-packages create a .pth file and add the full OS path to the lib directory.
  2. Try to import the custom_module in a test file (see my test file above).

Logs

Output for Python in the Output panel (ViewOutput, change the drop-down the upper-right of the Output panel to Python)

##########Linting Output - pydocstyle##########
##########Linting Output - mypy##########
##########Linting Output - prospector##########
##########Linting Output - prospector##########
##########Linting Output - pylama##########

Log (Window)

[2018-12-17 11:35:21.724] [renderer1] [error] Tree element not found: [object Object]: Error: Tree element not found: [object Object]
    at e.getElementLocation (file:///Applications/Design/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/workbench.main.js:214:266)
    at e.isCollapsed (file:///Applications/Design/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/workbench.main.js:213:757)
    at i.e.isCollapsed (file:///Applications/Design/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/workbench.main.js:962:723)
    at i.e.isExpanded (file:///Applications/Design/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/workbench.main.js:962:786)
    at t.revealMarkersForCurrentActiveEditor (file:///Applications/Design/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/workbench.main.js:4710:827)
    at t.autoReveal (file:///Applications/Design/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/workbench.main.js:4710:647)
    at t.onActiveEditorChanged (file:///Applications/Design/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/workbench.main.js:4707:826)
    at e.fire (file:///Applications/Design/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/workbench.main.js:189:532)
    at t.doEmitActiveEditorChangeEvent (file:///Applications/Design/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/workbench.main.js:4720:942)
    at t.handleActiveEditorChange (file:///Applications/Design/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/workbench.main.js:4720:718)
    at file:///Applications/Design/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/workbench.main.js:4721:55
    at e.fire (file:///Applications/Design/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/workbench.main.js:189:512)
    at file:///Applications/Design/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/workbench.main.js:5170:861
    at Object.g [as _notify] (file:///Applications/Design/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/workbench.main.js:167:807)
    at Object.enter (file:///Applications/Design/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/workbench.main.js:171:85)
    at n.Class.derive._creator._run (file:///Applications/Design/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/workbench.main.js:172:932)
    at n.Class.derive._creator._completed (file:///Applications/Design/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/workbench.main.js:172:373)
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:188:7)

Output from Console under the Developer Tools panel (toggle Developer Tools on under Help)

log.ts:169   ERR Tree element not found: [object Object]: Error: Tree element not found: [object Object]
    at e.getElementLocation (file:///Applications/Design/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/workbench.main.js:214:266)
    at e.isCollapsed (file:///Applications/Design/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/workbench.main.js:213:757)
    at i.e.isCollapsed (file:///Applications/Design/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/workbench.main.js:962:723)
    at i.e.isExpanded (file:///Applications/Design/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/workbench.main.js:962:786)
    at t.revealMarkersForCurrentActiveEditor (file:///Applications/Design/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/workbench.main.js:4710:827)
    at t.autoReveal (file:///Applications/Design/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/workbench.main.js:4710:647)
    at t.onActiveEditorChanged (file:///Applications/Design/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/workbench.main.js:4707:826)
    at e.fire (file:///Applications/Design/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/workbench.main.js:189:532)
    at t.doEmitActiveEditorChangeEvent (file:///Applications/Design/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/workbench.main.js:4720:942)
    at t.handleActiveEditorChange (file:///Applications/Design/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/workbench.main.js:4720:718)
    at file:///Applications/Design/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/workbench.main.js:4721:55
    at e.fire (file:///Applications/Design/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/workbench.main.js:189:512)
    at file:///Applications/Design/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/workbench.main.js:5170:861
    at Object.g [as _notify] (file:///Applications/Design/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/workbench.main.js:167:807)
    at Object.enter (file:///Applications/Design/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/workbench.main.js:171:85)
    at n.Class.derive._creator._run (file:///Applications/Design/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/workbench.main.js:172:932)
    at n.Class.derive._creator._completed (file:///Applications/Design/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/workbench.main.js:172:373)
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:188:7)
console.ts:134 [Extension Host] Python Extension: Failed to parse Prospector output SyntaxError: Unexpected end of JSON input
	at JSON.parse (<anonymous>)
	at module.exports.t.Prospector.<anonymous> (/~/.vscode/extensions/ms-python.python-2018.12.1/out/client/extension.js:83:585133)
	at Generator.next (<anonymous>)
	at module.exports.r (/~/.vscode/extensions/ms-python.python-2018.12.1/out/client/extension.js:83:584675)
	at new Promise (<anonymous>)
	at module.exports.r (/~/.vscode/extensions/ms-python.python-2018.12.1/out/client/extension.js:83:584452)
	at module.exports.t.Prospector.parseMessages (/~/.vscode/extensions/ms-python.python-2018.12.1/out/client/extension.js:83:585083)
	at module.exports.t.Prospector.<anonymous> (/~/.vscode/extensions/ms-python.python-2018.12.1/out/client/extension.js:1:77469)
	at Generator.next (<anonymous>)
	at s (/~/.vscode/extensions/ms-python.python-2018.12.1/out/client/extension.js:1:75269)
	at <anonymous>
t.log @ console.ts:134
t._logExtensionHostMessage @ extensionHost.ts:453
(anonymous) @ extensionHost.ts:244
emitTwo @ events.js:126
emit @ events.js:214
emit @ internal/child_process.js:772
_combinedTickCallback @ internal/process/next_tick.js:141
_tickCallback @ internal/process/next_tick.js:180

Issue Analytics

  • State:closed
  • Created 5 years ago
  • Reactions:1
  • Comments:6 (1 by maintainers)

github_iconTop GitHub Comments

1reaction
d3r3kkcommented, Jan 17, 2019

Thanks for bringing this up @jaredcm, an interesting problem!

I didn’t know about .pth files until this issue popped up so thank you for that.

I can repro this issue with the latest stable VS Code (1.30.2) + latest extension (2018.12.1), using the Jedi language server ("python.jediEnabled": true").

Workaround: The Microsoft Python Language Server (as of version 0.1.72.0, or greater) ~seems to handle this case~ (see below). Have you attempted to use this instead of Jedi? See this issue for details on how to enable/update the Microsoft Python Language Server.

Adding more than one entry.

Actually, on second look I have found that this is not handled properly by the Microsoft Python Language Server as I’d originally stated (at least version 0.1.72.0 doesn’t) as I’d left out the multiple lines in the .pth part after I got things up and running.

Indeed, if you add a .pth file to your site-packages with > 1 path, the issue does repro.

Here’s the sample workspace:

3727_module_resolution.zip

Here’s the sample .pth file contents that I placed in the site-packages. I created a .venv in my workspace and copied this file to ${workspaceFolder}/.venv/Lib/site-packages/test_3727.pth.

C:\\path\\to\\workspaceFolder\\3727_module_resolution
C:\\path\\to\\workspaceFolder\\3727_module_resolution\\lib
0reactions
luabudcommented, Sep 11, 2019

Closing in favour of https://github.com/microsoft/python-language-server/issues/537. If you experience this with jedi, please file an issue on the jedi repo

Read more comments on GitHub >

github_iconTop Results From Across the Web

How can I import a module dynamically given the full path?
The advantage of adding a path to sys.path (over using imp) is that it simplifies things when importing more than one module from...
Read more >
PEP 328 – Imports: Multi-Line and Absolute/Relative
To resolve the ambiguity, it is proposed that foo will always be a module or package reachable from sys.path . This is called...
Read more >
Python import: Advanced Techniques and Tips
Handle resources and data files inside your packages; Import modules dynamically at runtime; Customize Python's import system. Throughout the tutorial, you'll ...
Read more >
Traps for the Unwary in Python's Import System
The fact that most methods of invoking Python code from the command line break when that code is inside a package, and the...
Read more >
Python Tutorial - File and Text Processing
It returns an empty string after the end-of-file (EOF). ... The fileinput module provides support for processing lines of input from one or...
Read more >

github_iconTop Related Medium Post

No results found

github_iconTop Related StackOverflow Question

No results found

github_iconTroubleshoot Live Code

Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free

github_iconTop Related Reddit Thread

No results found

github_iconTop Related Hackernoon Post

No results found

github_iconTop Related Tweet

No results found

github_iconTop Related Dev.to Post

No results found

github_iconTop Related Hashnode Post

No results found