2017-07-03 123 views
3

对不起,这绝对是重复的,但我找不到答案。我在Python 3个工作,这是我的应用程序的结构:如何导入Python文件?

/home 
    common.py 
    australia/ 
    new-south-wales/ 
     fetch.py 

我在home/目录,运行fetch.py。如何在该脚本中导入common.py中的函数?

我已经设置了fetch.py如下:

from common import writeFile 

,但我得到了以下错误:

File "australia/new-south-wales/fetch.py", line 8, in <module> 
    from common import writeFile 
ModuleNotFoundError: No module named 'common' 

如果我只是做python -c "from common import writeFile"我没有看到一个错误。

不应该翻译look in the current directory for modules

+1

你错过了一个'__init __ py'为模块。 https://docs.python.org/3/tutorial/modules.html#packages –

回答

5

之前导入您的目录,需要进口必须有文件__init__.py该文件夹中

#solution 1(在运行时进口)

要在“运行”中导入特定的Python文件用已知名称:

import os 
import sys 
script_dir = "/path/to/your/code/directory" 

# Add the absolute directory path containing your 
# module to the Python path 

sys.path.append(os.path.abspath(script_dir)) 

import filename 

#solution 2(文件添加到Python库中的一个)

也因为你有一个共同的库可以运行

>>> import sys 
>>> print sys.path 

,看看哪些目录,你可以把你的代码,并在每次使用project.you可以您共同包移动到该目录中,并把它像common.py正常package.for例如,如果你把它放在这个目录中的一个的一个根目录就可以导入像import common

#solution 3(使用相对进口)

# from two parent above current directory import common 
# every dot for one parent directory 
from ... import common 

,然后转到父目录并运行

python -m home.australia.new-south-wales.fetch 
+0

Thanks.This似乎很不雅 - 是否有更好的方式来共享不同子目录中脚本之间的常用函数? (另外,我想你的意思是'__init __。py'?) – Richard

+0

我在'home /'中添加了一个空的'__init __。py'文件,并且我添加了'scriptpath =“../../common。在'fetch.py​​'中后面跟着'import common'。尝试从'home /'运行'fetch.py​​'时仍然出现错误。 – Richard

+0

是的,我的意思是'__init __。py';我也使用这种方式;将脚本路径改为'“../../”' –

1

从我假设你没有运行此为完整的Python包,只是作为单独的文件说明。

你可以做的是使用完整的模块。这意味着使用您的代码将空的__init__.py添加到目录。您还必须将new-south-wales的名称更改为new_south_wales,因为它需要是有效的模块名称。

假设home是你的应用程序的名称,你应该结束了:

home/ 
    __init__.py 
    common.py 
    australia/ 
    __init__.py 
    new_south_wales/ 
     __init__.py 
     fetch.py 

接下来,你需要一个启动脚本为您的应用程序 - 这意味着无论是简单的东西,如:

#!/usr/bin/env python 
from australia.new_south_wales import fetch 
fetch.your_main_function() 

或者您可以添加一个setup.py以及完整的包装说明。如果您指定entry points并且该脚本将自动创建。

现在,你开始在包的情况下你的代码,你fetch.py可以这样做:

from ..common import writeFile