从位于子目录中的脚本中的父目录导入

时间:2016-07-21 03:21:45

标签: python python-3.x python-import

这是我的目录结构:

my_package
|
+--__init__.py
|
+--setup.py
|
+--module.py
|
+--sub_package
   |
   +--__init__.py
   |
   +--script.py

脚本script.py需要从module.py导入一个函数,我需要能够使用Python解释器运行script.py

我知道Guido称之为“反模式”。而且我知道你有10个理由我不应该这样做。我可能同意他们中的大多数 - 我真的。如果我能避免这种情况,我不会问这个问题。那么,我们可以跳过我们讨论为什么这么糟糕的部分并继续解决方案吗?谢谢!

我也知道其他大约有1000个问题。我现在可能已经把它们全部读完了。其中大多数都是通过改变Python的导入系统而过时的,其余的都是不对的。

我尝试过:

  • from .module import my_function中使用script.py,然后在目录python script.py内运行sub_package或在目录python sub_package/script.py内运行my_package。无论哪种方式,我都会收到错误:

SystemError: Parent module '' not loaded, cannot perform relative import

  • 使用from module import my_functionfrom my_package.module import my_function并按上述方式运行script.py(来自sub_packagemy_package)。我明白了:

ImportError: No module named 'module'

(或类似于my_package而不是module

  • python -m sub_package/script的父目录中的my_packagepython -m my_package/sub_package/script目录运行my_package。我明白了:

No module named sub_package/script

(或类似于my_package/sub_package/script

还有什么我应该尝试的吗?我会真的而不是因为一系列原因而混淆sys.pathPYTHONPATH

2 个答案:

答案 0 :(得分:0)

我相信你可以说

import module
如果您执行以下操作,请从script.py

从mypackage目录中的终端运行:

$ python setup.py install

这将允许您创建所需的import语句。我用这种方法找到的一个问题是你必须调用

$ python setup.py install

每次对module.py进行更改,但如果您对此方法有效,则此方法应该有效

答案 1 :(得分:0)

实际上,python解释器会在sys.path中找到模块。这意味着如果你将这个例子中的模块目录“somepath / my_package”添加到sys.path中,python将通过“import module”找到它。

那么如何实现这一目标呢?

如果您的目录绝对路径永远不会改变,您可以在下面执行此操作:

sys.path.append(yourAbsPath)

但有时目录的路径可能会改变,但相对路径不会改变。所以我建议按照这个步骤,尝试将其添加到script.py的开头:

import sys
import os
my_packagePath = os.path.dirname(os.path.dirname(__file__))
sys.path.append(my_packagePath)
import module
#from module import yourFunction #replace yourFunction with your real function 

在cmd工具中,只需输入“python yourScript.py的abspath”。