所以我通常使用Python 2.7.x,但我决定今天使用Python 3,看看我是否想要升级。我下载并安装了Python 3.6.2,到目前为止我还不相信!
所以我试图从驻留在同一目录中的另一个Python脚本/模块导入一些代码。以下是一个例子。
目录结构
WorkingDir
|-- main.py
|-- module_a.py
main.py
import os
import module_a
if(__name__ == "__main__"):
module_a.sayHi()
module_a.py
def sayHi():
print("Hi There!")
如果我运行以下内容:
python main.py
我收到以下错误:
Traceback (most recent call last):
File "main.py", line 2, in <module>
import module_a
ModuleNotFoundError: No module named 'module_a'
阅读此处的文档:https://docs.python.org/3/tutorial/modules.html
6.1.2. The Module Search Path
When a module named spam is imported, the interpreter first searches
for a built-in module with that name. If not found, it then searches
for a file named spam.py in a list of directories given by the variable
sys.path. sys.path is initialized from these locations:
The directory containing the input script (or the current directory
when no file is specified).
PYTHONPATH (a list of directory names, with the same syntax as the
shell variable PATH).
The installation-dependent default.
所以我也尝试设置PYTHONPATH
,但仍然收到错误。我也尝试过各种其他格式,例如from ... import ...
但没有成功。我错过了什么或文档是否有问题?
有些用户指出我应该在__init__.py
中添加WorkingDir
。我试过了,但它对我不起作用。此外,文档使我觉得我不再需要__init__.py
文件来使导入工作,我希望,对于这个特定的测试,如果可能的话,尽量避免使用它们。
我还想说,我使用Python 2.7.13尝试了完全相同的文件而没有任何更改,并且__init__.py
中有{J}和WorkingDir
都可以正常工作。
由于其中一位评论者无法重现该问题,我尝试运行他/她正在使用的Python 3版本(Python 3.5.2)并且我没有收到错误。使用该版本,一切都按预期工作。我相信这是Python 3.6.2中的一个错误,并在Python bug跟踪器上提交了一个错误报告:http://bugs.python.org/issue31056
答案 0 :(得分:0)
它对我有用。这是一个链接https://trinket.io/python/c444397102
答案 1 :(得分:0)
Python 3的工作原理如文档中所述。问题是我下载了&#34; embedded&#34; Python包,根据文档可从Python 3.5开始提供。 https://docs.python.org/3.6/using/windows.html#embedded-distribution
在&#34;查找模块&#34; Python 3文档的一部分:https://docs.python.org/3.6/using/windows.html#finding-modules,我错过了一个导致导入错误的句子。
To completely override sys.path, create a ._pth file with the same
name as the DLL (python36._pth) or the executable (python._pth) and
specify one line for each path to add to sys.path. The file based on
the DLL name overrides the one based on the executable, which allows
paths to be restricted for any program loading the runtime if desired.
When the file exists, all registry and environment variables are
ignored, isolated mode is enabled, and site is not imported unless one
line in the file specifies import site. Blank paths and lines starting
with # are ignored. Each path may be absolute or relative to the
location of the file. Import statements other than to site are not
permitted, and arbitrary code cannot be specified.
标准Python安装没有._pth
文件,使样本按预期工作。同样从嵌入式发行版中删除._pth
文件会使我发布的示例工作。虽然嵌入式发行版仅用于特定目的,但只能根据上面链接的Python文档使用。