Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从不同目录导入python包_Python_Python 2.7_Python Import - Fatal编程技术网

从不同目录导入python包

从不同目录导入python包,python,python-2.7,python-import,Python,Python 2.7,Python Import,我有以下目录结构: \something\python\ extras\ __init__.py # empty file decorators.py # contains a benchmark decorator (and other things) 20131029\ # not a package, this contains the scripts i use directly by doing "python somethingel

我有以下目录结构:

\something\python\
    extras\
        __init__.py # empty file
        decorators.py # contains a benchmark decorator (and other things)
    20131029\   # not a package, this contains the scripts i use directly by doing "python somethingelse.py"
        somethingelse.py
现在我想做一些事情,比如

from .extras import decorators
from decorators import benchmark
从里面找些东西

要使其正常工作,我需要将
\uuuu init\uuuu.py
文件放在哪里(目前,“\something\python\”路径已添加到我的.tchsrc中)

现在,我得到以下错误:

 from .extras import decorators
ValueError: Attempted relative import in non-package
将它添加到我的pythonpath中有问题吗?或者我应该如何解决这个问题?当前的解决方法是将decorators.py复制粘贴到我创建的每个新目录中(如果我创建了代码的新版本,如“20131029”),但这只是一个愚蠢的解决方法,意味着每次创建代码的新版本时,我都必须复制粘贴大量内容,因此,我想要一个更优雅的版本和正确的导入

注意:我使用的是Python2.7,如果这有什么区别的话

编辑:是的,我通过执行

python somethingelse.py
更多编辑:不知道基准装饰器的定义方式是否重要?(它不是一个类,下一件事完全来自decorators.py文件)

编辑:如果我把\something\python\extras\放在我的pythonpath上,我会得到

ImportError: No module named decorators
当我跑步时:

from decorators import benchmark
这是否意味着在extras目录中,我需要创建另一个子目录,在其中放置decorators.py

编辑:在.tchsrc中,我添加了以下行:

setenv PYTHONPATH /bla/blabla/something/python/extras/
在somethingelse.py中,如果我运行以下命令:

import sys
s = sys.path
for k in s:
    print k

我发现路径/bla/blabla/something/python/extras/在该列表中,因此我不明白为什么它不起作用?

您的
20131029
目录不是一个包,因此您不能使用它之外的相对导入路径

您可以使用当前脚本中的相对路径,将
extras
目录添加到Python模块搜索路径中:

import sys, os

here = os.path.dirname(os.path.abspath(__file__))

sys.path.insert(0, os.path.normpath(os.path.join(here, '../extras')))
现在导入首先在
extras
目录中查找模块,因此使用:

import decorators
因为您的目录名本身只使用数字,所以您不能将其作为包;包名称必须遵守Python标识符规则,不能以数字开头。即使您重命名了目录,并添加了
\uuuu init\uuuu.py
文件,当您将目录中的文件作为脚本运行时,仍然无法将其作为包使用;脚本始终被视为位于包之外。您必须有一个顶级“shim”脚本,用于从包中导入真正的代码:

from package_20131029.somethingelse import main

main()

您的
20131029
目录不是一个包,因此您不能使用超出它的相对导入路径

您可以使用当前脚本中的相对路径,将
extras
目录添加到Python模块搜索路径中:

import sys, os

here = os.path.dirname(os.path.abspath(__file__))

sys.path.insert(0, os.path.normpath(os.path.join(here, '../extras')))
现在导入首先在
extras
目录中查找模块,因此使用:

import decorators
因为您的目录名本身只使用数字,所以您不能将其作为包;包名称必须遵守Python标识符规则,不能以数字开头。即使您重命名了目录,并添加了
\uuuu init\uuuu.py
文件,当您将目录中的文件作为脚本运行时,仍然无法将其作为包使用;脚本始终被视为位于包之外。您必须有一个顶级“shim”脚本,用于从包中导入真正的代码:

from package_20131029.somethingelse import main

main()

您的
20131029
目录不是一个包,因此您不能使用超出它的相对导入路径

您可以使用当前脚本中的相对路径,将
extras
目录添加到Python模块搜索路径中:

import sys, os

here = os.path.dirname(os.path.abspath(__file__))

sys.path.insert(0, os.path.normpath(os.path.join(here, '../extras')))
现在导入首先在
extras
目录中查找模块,因此使用:

import decorators
因为您的目录名本身只使用数字,所以您不能将其作为包;包名称必须遵守Python标识符规则,不能以数字开头。即使您重命名了目录,并添加了
\uuuu init\uuuu.py
文件,当您将目录中的文件作为脚本运行时,仍然无法将其作为包使用;脚本始终被视为位于包之外。您必须有一个顶级“shim”脚本,用于从包中导入真正的代码:

from package_20131029.somethingelse import main

main()

您的
20131029
目录不是一个包,因此您不能使用超出它的相对导入路径

您可以使用当前脚本中的相对路径,将
extras
目录添加到Python模块搜索路径中:

import sys, os

here = os.path.dirname(os.path.abspath(__file__))

sys.path.insert(0, os.path.normpath(os.path.join(here, '../extras')))
现在导入首先在
extras
目录中查找模块,因此使用:

import decorators
因为您的目录名本身只使用数字,所以您不能将其作为包;包名称必须遵守Python标识符规则,不能以数字开头。即使您重命名了目录,并添加了
\uuuu init\uuuu.py
文件,当您将目录中的文件作为脚本运行时,仍然无法将其作为包使用;脚本始终被视为位于包之外。您必须有一个顶级“shim”脚本,用于从包中导入真正的代码:

from package_20131029.somethingelse import main

main()

您是否运行“pythonsomethingelse.py”?python软件包不是这样工作的。@georgesl是的,我是这样运行的,我需要如何使它运行才能这样工作?不要给你的软件包(即带有
\uu init\uuuuuuuuuupy
的文件夹)以数字开头的名称,以后很难导入它们。你运行“python somethingelse.py”吗?python软件包不是这样工作的。@georgesl是的,我是这样运行的,我需要如何使它运行才能这样工作?不要给你的软件包(即带有
\uu init\uuuuuuuuuupy
的文件夹)以数字开头的名称,以后很难导入它们。你运行“python somethingelse.py”吗?python软件包不是这样工作的。@georgesl是的,我是这样运行的,我需要如何使它运行才能这样工作?不要给你的软件包(即带有
\uu init\uuuuuuuuuupy
的文件夹)以数字开头的名称,以后很难导入它们。你运行“python somethingelse.py”吗?python软件包不是这样工作的。@georgesl是的,我是这样运行的,我需要如何使它这样运行呢