我想从同一目录中的另一个文件导入一个函数.
有时它适用于我,from .mymodule import myfunction
但有时我会得到:
SystemError: Parent module '' not loaded, cannot perform relative import
Run Code Online (Sandbox Code Playgroud)
有时它适用from mymodule import myfunction
,但有时我也得到:
SystemError: Parent module '' not loaded, cannot perform relative import
Run Code Online (Sandbox Code Playgroud)
我不明白这里的逻辑,我找不到任何解释.这看起来完全随机.
有人可以向我解释这一切背后的逻辑是什么吗?
我正在运行Python 2.5.
这是我的文件夹树:
ptdraft/
nib.py
simulations/
life/
life.py
Run Code Online (Sandbox Code Playgroud)
(我也在__init__.py
每个文件夹中,为了便于阅读,这里省略了)
如何nib
从模块内导入life
模块?我希望有可能不用修补sys.path.
注意:正在运行的主模块位于该ptdraft
文件夹中.
Python的sys.path在哪里初始化?
UPD:Python在引用PYTHONPATH之前添加了一些路径:
>>> import sys
>>> from pprint import pprint as p
>>> p(sys.path)
['',
'C:\\Python25\\lib\\site-packages\\setuptools-0.6c9-py2.5.egg',
'C:\\Python25\\lib\\site-packages\\orbited-0.7.8-py2.5.egg',
'C:\\Python25\\lib\\site-packages\\morbid-0.8.6.1-py2.5.egg',
'C:\\Python25\\lib\\site-packages\\demjson-1.4-py2.5.egg',
'C:\\Python25\\lib\\site-packages\\stomper-0.2.2-py2.5.egg',
'C:\\Python25\\lib\\site-packages\\uuid-1.30-py2.5.egg',
'C:\\Python25\\lib\\site-packages\\stompservice-0.1.0-py2.5.egg',
'C:\\Python25\\lib\\site-packages\\cherrypy-3.0.1-py2.5.egg',
'C:\\Python25\\lib\\site-packages\\pyorbited-0.2.2-py2.5.egg',
'C:\\Python25\\lib\\site-packages\\flup-1.0.1-py2.5.egg',
'C:\\Python25\\lib\\site-packages\\wsgilog-0.1-py2.5.egg',
'c:\\testdir',
'C:\\Windows\\system32\\python25.zip',
'C:\\Python25\\DLLs',
'C:\\Python25\\lib',
'C:\\Python25\\lib\\plat-win',
'C:\\Python25\\lib\\lib-tk',
'C:\\Python25',
'C:\\Python25\\lib\\site-packages',
'C:\\Python25\\lib\\site-packages\\PIL',
'C:\\Python25\\lib\\site-packages\\win32',
'C:\\Python25\\lib\\site-packages\\win32\\lib',
'C:\\Python25\\lib\\site-packages\\Pythonwin']
Run Code Online (Sandbox Code Playgroud)
我的PYTHONPATH是:
PYTHONPATH=c:\testdir
Run Code Online (Sandbox Code Playgroud)
我想知道PYTHONPATH之前的那些路径来自哪里?
编辑:基于Ulf Rompe的注释,重要的是你使用"1"代替"0",否则你将破坏sys.path.
我已经做了很长一段时间的python(超过一年),我总是很困惑,为什么人们建议你使用sys.path.append()
而不是sys.path.insert()
.让我来证明一下.
假设我正在开发一个名为PyWorkbooks的模块(安装在我的计算机上),但我同时处理一个包含PyWorkbooks的不同模块(比方说PyJob).当我正在使用PyJob时,我发现PyWorkbooks中的错误正在纠正,所以我想导入一个开发版本.
有两种方法可以同时工作(例如,我可以将PyWorkbooks项目放在PyJob中),但有时我仍然需要使用路径.但是,我不能简单地对sys.path.append()
PyWorkbooks所在的文件夹执行操作.为什么?因为python会首先找到我安装的PyWorkbooks!
这就是你必须做一个sys.path.insert(1,path_to_dev_pyworkbooks)的原因
综上所述:
sys.path.append(path_to_dev_pyworkbooks)
import PyWorkbooks # does NOT import dev pyworkbooks, imports installed one
Run Code Online (Sandbox Code Playgroud)
要么:
sys.path.insert(1, path_to_dev_pyworkbooks) # based on comments you should use **1 not 0**
import PyWorkbooks # imports correct file
Run Code Online (Sandbox Code Playgroud)
这对我来说已经引起了一些困扰,如果我们(作为一个社区)开始推荐sys.path.insert(1, path)
,我真的很喜欢它,好像你是手动插入一条路径我认为可以说这是你想要的路径用!
或者我有什么不对劲?这个问题有时会困扰我,我希望它在公开场合!
我有这种文件结构(目录和箭头文件后):
model -> py_file.py
report -> other_py_file.py
Run Code Online (Sandbox Code Playgroud)
主要__init__.py
:
import model
import report
Run Code Online (Sandbox Code Playgroud)
型号目录:
import py_file
Run Code Online (Sandbox Code Playgroud)
报告目录:
import other_py_file
Run Code Online (Sandbox Code Playgroud)
现在在other_py_file
我想要导入py_file
,但是我尝试了什么,我给出错误,没有这样的模块.
我试过这个:
from model import py_file
然后:
import py_file
看起来这两个文件夹看不到对方.从其他目录导入文件的方法是什么?我是否需要在init .py文件中指定一些额外的导入?
我正在根据不同的导入规则在教程之后使用Python 3.5构建Flask应用程序.通过查找类似的问题,我设法通过将文件夹添加到路径来解决基于从嵌套文件夹导入的ImportError,但我仍然无法从同一文件夹(已在路径中)的脚本中导入函数.文件夹结构是这样的:
DoubleDibz
??? app
? ??? __init__.py
? ??? api
? ? ??? __init__.py
? ? ??? helloworld.py
? ??? app.py
? ??? common
? ? ??? __init__.py
? ? ??? constants.py
? ??? config.py
? ??? extensions.py
? ??? static
? ??? templates
??? run.py
Run Code Online (Sandbox Code Playgroud)
在app.py中,我使用以下代码从config.py导入一个函数:
import config as Config
Run Code Online (Sandbox Code Playgroud)
但我得到这个错误:
ImportError: No module named 'config'
Run Code Online (Sandbox Code Playgroud)
我不明白是什么问题,是同一个文件夹中的两个文件.提前致谢
python ×6
path ×3
python-3.x ×2
directory ×1
flask ×1
module ×1
openerp ×1
pythonpath ×1
sys ×1