这是我的目录结构:
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_function
或from my_package.module import my_function
并按上述方式运行script.py
(来自sub_package
或my_package
)。我明白了: ImportError: No module named 'module'
(或类似于my_package
而不是module
)
python -m sub_package/script
的父目录中的my_package
或python -m my_package/sub_package/script
目录运行my_package
。我明白了: No module named sub_package/script
(或类似于my_package/sub_package/script
)
还有什么我应该尝试的吗?我会真的而不是因为一系列原因而混淆sys.path
或PYTHONPATH
。
答案 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”。