关于python:如何从同一文件夹中的模块导入函数?

How to import a function from a module in the same folder?

我试图用函数将我的脚本分成几个文件,所以我将一些函数移到了单独的文件中,并希望将它们导入到一个主文件中。结构为:

1
2
3
core/
  main.py
  posts_run.py

posts_run.py有两个功能,get_all_postsretrieve_posts,所以我尝试用以下方法导入get_all_posts

1
from posts_run import get_all_posts

python 3.5给出了错误:

1
ImportError: cannot import name 'get_all_posts'

main.py包含以下代码行:

1
2
3
4
5
import vk
from configs import client_id, login, password
session = vk.AuthSession(scope='wall,friends,photos,status,groups,offline,messages',   app_id=client_id, user_login=login,
                     user_password=password)
api = vk.API(session)

然后我需要将API导入到函数中,这样我就能够获得对VK的API调用。

全堆栈跟踪

1
2
3
4
5
6
7
8
Traceback (most recent call last):
  File"E:/gited/vkscrap/core/main.py", line 26, in <module>
    from posts_run import get_all_posts
  File"E:\gited\vkscrap\core\posts_run.py", line 7, in <module>
    from main import api, absolute_url, fullname
  File"E:\gited\vkscrap\core\main.py", line 26, in <module>
    from posts_run import get_all_posts
ImportError: cannot import name 'get_all_posts'

api-是main.py中的api = vk.API(session)。绝对URL和全名也存储在main.py中。我在Windows7上使用pycharm 2016.1,在virtualenv中使用python3.5 x64。如何导入此函数?


您需要在核心文件夹中添加__init__.py。出现此错误是因为python无法将文件夹识别为python包。

之后做

1
2
3
4
5
from .posts_run import get_all_posts
#    ^ here do relative import
# or
from core.posts_run import get_all_posts
# because your package named 'core' and importing looks in root folder


从这个问题中可以找到一个作弊的解决方案(问题是为什么使用sys.path.append(path)而不是sys.path.insert(1,path)?.基本上你做以下的

1
2
3
    import sys
    sys.path.insert(1, directory_path_your_code_is_in)
    import file_name_without_dot_py_at_end

当你在pycharm 2016.1中运行它时,它可能在与你期望的不同的当前目录中…


MyFile.py:

1
2
def myfunc():
    return 12

启动python解释器:

1
2
3
>>> from MyFile import myFunc
>>> myFunc()
12

可选地:

1
2
3
>>> import MyFile
>>> MyFile.myFunc()
12

这对你的机器不起作用吗?


python找不到要导入的模块,因为它是从另一个目录执行的。

打开一个终端和CD到脚本的文件夹中,然后从那里执行python。

在脚本中运行此代码以从执行python的位置打印:

1
2
import os
print(os.getcwd())

编辑:这是我的意思的证明

把上面的代码放在位于C:\folder\test.pytest.py文件中。

打开终端和类型

1
python3 C:\folder\test.py

这将输出python可执行文件的基目录

现在类型

1
2
cd C:\folder
python3 test.py

这将输出C:\folder\。因此,如果您在folder中有其他模块,那么导入它们应该不是问题。

我通常将bash/batch脚本写入cd目录并启动程序。这使得对主机没有影响