2016-08-30 334 views
1

我想將我的腳本分成幾個帶有功能的文件,所以我將一些功能移到了單獨的文件中,並希望將它們導入到一個主文件中。其結構是:如何從同一文件夾中的模塊導入功能?

core/ 
    main.py 
    posts_run.py 

posts_run.py有兩個功能,get_all_postsretrieve_posts,所以我儘量進口get_all_posts有:

from posts_run import get_all_posts 

的Python 3.5給出了錯誤:

ImportError: cannot import name 'get_all_posts' 

Main.py包含以下幾行代碼:

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函數,所以我有能力獲得API調用vk。

完整的堆棧跟蹤

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) absolute_url和fullname也存儲在main.py中。 我在Windows 7上使用PyCharm 2016.1,在virtualenv中使用Python 3.5 x64。 如何導入此功能?

+0

退房導入文檔在這裏,應該告訴你一切你需要知道的:https://docs.python.org/3/reference/import.html –

+0

可能重複的[從父文件夾導入模塊](http://stackoverflow.com/questions/ 714063 /從父文件夾導入模塊) – aruisdante

+0

@ DanielleM.I在堆棧上閱讀了幾個問題,並閱讀了導入文檔,但沒有任何效果。 – Oleksiy

回答

1

您需要在覈心文件夾中添加__init__.py。您收到此錯誤,因爲作爲python package

之後做

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 
+0

我這樣做了,也沒有效果。 Python引發同樣的錯誤 – Oleksiy

+0

閱讀更新應該可以解決你的問題。 –

+0

@OleksiyOvdiyenko你確定你的python模塊在你的**本地目錄**嗎? –

1

MyFile.py蟒蛇不承認你的文件夾:

def myfunc(): 
    return 12 

啓動Python解釋器:

>>> from MyFile import myFunc 
>>> myFunc() 
12 

或者:

>>> import MyFile 
>>> MyFile.myFunc() 
12 

這不適用於您的機器嗎?

+0

他可能沒有他的自定義python模塊在他的本地目錄。 –

+0

我不確定確切的規則或順序,但python會查看當前目錄以及sys.path,$ PYTHONPATH等。 –

+0

是的,它適用於此func,但是當我嘗試調用''' 'import posts_run''' it raise'''ImportError:無法導入名字'get_all_posts'''' – Oleksiy

0

Python沒有找到要導入的模塊,因爲它是從另一個目錄執行的。

打開一個終端並cd進腳本的文件夾,然後從那裏執行python。

運行,其中蟒蛇正從執行該代碼在你的腳本從打印:

import os 
print(os.getcwd()) 

編輯: 這是我的意思

示範把上面的代碼中test.py文件位於C:\folder\test.py

打開終端並鍵入

python3 C:\folder\test.py 

這將輸出蟒可執行

的基本目錄現在類型

cd C:\folder 
python3 test.py 

這將輸出C:\folder\。所以如果你有其他的模塊folder導入它們不應該是一個問題

我通常寫一個bash /批處理腳本cd到目錄並啓動我的程序。這可以對主機產生零影響

+0

我需要添加到路徑每次我使用文件夾中的文件新項目? – Oleksiy

1

可以從這個問題中找到一個作弊解決方案(問題是Why use sys.path.append(path) instead of sys.path.insert(1, path)?)。基本上你做以下

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

這將讓一輪因爲你是在PyCharm 2016.1運行它,它可能是在不同的當前目錄下,你期待什麼?

+0

這篇文章更詳細 - http://stackoverflow.com/questions/897792/pythons-sys-path-value/38403654#38403654 –