Importing from a relative path in Python

匿名 (未验证) 提交于 2019-12-03 01:34:02

问题:

I have a folder for my client code, a folder for my server code, and a folder for code that is shared between them

Proj/     Client/         Client.py     Server/         Server.py     Common/         __init__.py         Common.py 

How do I import Common.py from Server.py and Client.py?

回答1:

Don't do relative import.

From PEP8:

Relative imports for intra-package imports are highly discouraged.

Put all your code into one super package (i.e. "myapp") and use subpackages for client, server and common code.

Update: "Python 2.6 and 3.x supports proper relative imports (...)". See Dave's answers for more details.



回答2:

EDIT Nov 2014 (3 years later):

Python 2.6 and 3.x supports proper relative imports, where you can avoid doing anything hacky. With this method, you know you are getting a relative import rather than an absolute import. The '..' means, go to the directory above me:

from ..Common import Common 

As a caveat, this will only work if you run your python as a module, from outside of the package. For example:

python -m Proj 

Original hacky way

This method is still commonly used in some situations, where you aren't actually ever 'installing' your package. For example, it's popular with Django users.

You can add Common/ to your sys.path (the list of paths python looks at to import things):

import sys, os sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'Common')) import Common 

os.path.dirname(__file__) just gives you the directory that your current python file is in, and then we navigate to 'Common/' the directory and import 'Common' the module.



回答3:

The default import method is already "relative", from the PYTHONPATH. The PYTHONPATH is by default, to some system libraries along with the folder of the original source file. If you run with -m to run a module, the current directory gets added to the PYTHONPATH. So if the entry point of your program is inside of Proj, then using import Common.Common should work inside both Server.py and Client.py.

Don't do a relative import. It won't work how you want it to.



回答4:

Doing a relative import is absolulutely OK! Here's what little 'ol me does:

#first change the cwd to the script path scriptPath = os.path.realpath(os.path.dirname(sys.argv[0])) os.chdir(scriptPath)  #append the relative location you want to import from sys.path.append("../common")  #import your module stored in '../common' import common.py 


回答5:

Funny enough, a same problem I just met, and I get this work in following way:

combining with linux command ln , we can make thing a lot simper:

1. cd Proj/Client 2. ln -s ../Common ./  3. cd Proj/Server 4. ln -s ../Common ./ 

And, now if you want to import some_stuff from file: Proj/Common/Common.py into your file: Proj/Client/Client.py, just like this:

# in Proj/Client/Client.py from Common.Common import some_stuff 

And, the same applies to Proj/Server, Also works for setup.py process, a same question discussed here, hope it helps !



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!