如何導入其餘Python文件?

如何在Python中導入其餘文件? html

  1. 我究竟該如何導入特定的python文件(如import file.py
  2. 如何導入文件夾而不是特定文件?
  3. 我想根據用戶輸入在運行時動態加載Python文件。
  4. 我想知道如何從文件中僅加載一個特定部分。

例如,在main.py我有: python

from extra import *

儘管這爲我提供了extra.py全部定義,可是也許我想要的只是一個定義: git

def gap():
    print
    print

我怎麼添加到import語句先手gapextra.pygithub


#1樓

您沒有不少複雜的方法能夠將python文件從一個文件夾導入到另外一個文件夾。 只需建立一個__init__.py文件,以聲明此文件夾爲python軟件包,而後轉到要導入的主機文件便可,只需鍵入 編程

from root.parent.folder.file import variable, class, whatever cookie


#2樓

要在「運行時」以已知名稱導入特定的Python文件: app

import os
import sys

... ide

scriptpath = "../Test/"

# Add the directory containing your module to the Python path (wants absolute paths)
sys.path.append(os.path.abspath(scriptpath))

# Do the import
import MyModule

#3樓

導入python文件的方法有不少,各有利弊。

不要只是匆忙地選擇適合您的第一個導入策略,不然稍後您將在發現不符合您的須要時重寫代碼庫。 函數

我將首先說明最簡單的示例#1,而後將介紹最專業,最可靠的示例#7 spa

示例1,使用python解釋器導入python模塊:

  1. 將其放在/home/el/foo/fox.py中:

    def what_does_the_fox_say(): print("vixens cry")
  2. 進入python解釋器:

    el@apollo:/home/el/foo$ python Python 2.7.3 (default, Sep 26 2013, 20:03:06) >>> import fox >>> fox.what_does_the_fox_say() vixens cry >>>

    您經過python解釋器導入了fox,並從fox.py中調用了python函數what_does_the_fox_say()

示例2,在腳本中使用execfile或( Python 3中的exec )在適當的位置執行另外一個python文件:

  1. 將其放在/home/el/foo2/mylib.py中:

    def moobar(): print("hi")
  2. 將其放在/home/el/foo2/main.py中:

    execfile("/home/el/foo2/mylib.py") moobar()
  3. 運行文件:

    el@apollo:/home/el/foo$ python main.py hi

    功能moobar是從mylib.py導入的,並在main.py中可用

示例3,從...使用...導入...功能:

  1. 將其放在/home/el/foo3/chekov.py中:

    def question(): print "where are the nuclear wessels?"
  2. 將其放在/home/el/foo3/main.py中:

    from chekov import question question()
  3. 像這樣運行它:

    el@apollo:/home/el/foo3$ python main.py where are the nuclear wessels?

    若是您在chekov.py中定義了其餘函數,除非您import *不然它們將不可用import *

示例4,若是導入的riaa.py與導入的文件位於不一樣的文件位置

  1. 將其放在/home/el/foo4/stuff/riaa.py中:

    def watchout(): print "computers are transforming into a noose and a yoke for humans"
  2. 將其放在/home/el/foo4/main.py中:

    import sys import os sys.path.append(os.path.abspath("/home/el/foo4/stuff")) from riaa import * watchout()
  3. 運行:

    el@apollo:/home/el/foo4$ python main.py computers are transforming into a noose and a yoke for humans

    那會從另外一個目錄導入外部文件中的全部內容。

示例5,使用os.system("python yourfile.py")

import os
os.system("python yourfile.py")

示例6,經過piggy帶python startuphook導入文件:

更新:此示例曾經同時適用於python2和3,但如今僅適用於python2。 python3擺脫了此用戶啓動鉤子功能集,由於它被低技能的python庫編寫者濫用,使用它在全部用戶定義的程序以前不禮貌地將其代碼注入到全局名稱空間中。 若是您但願此功能適用於python3,則必須變得更有創意。 若是我告訴您如何作,python開發人員也會禁用該功能集,所以您是一我的。

參見: https : //docs.python.org/2/library/user.html

將此代碼放在~/.pythonrc.py主目錄中

class secretclass:
    def secretmessage(cls, myarg):
        return myarg + " is if.. up in the sky, the sky"
    secretmessage = classmethod( secretmessage )

    def skycake(cls):
        return "cookie and sky pie people can't go up and "
    skycake = classmethod( skycake )

將此代碼放入您的main.py(能夠在任何地方):

import user
msg = "The only way skycake tates good" 
msg = user.secretclass.secretmessage(msg)
msg += user.secretclass.skycake()
print(msg + " have the sky pie! SKYCAKE!")

運行它,您應該得到如下信息:

$ python main.py
The only way skycake tates good is if.. up in the sky, 
the skycookie and sky pie people can't go up and  have the sky pie! 
SKYCAKE!

若是您在此處ModuleNotFoundError: No module named 'user'錯誤: ModuleNotFoundError: No module named 'user'則意味着您使用的是python3,默認狀況下禁用了啓動鉤。

值得一提的是: https : //github.com/docwhat/homedir-examples/blob/master/python-commandline/.pythonrc.py隨便發送。

示例7,最健壯:使用裸導入命令在python中導入文件:

  1. 新建一個目錄/home/el/foo5/
  2. 新建一個目錄/home/el/foo5/herp
  3. 在herp下建立一個名爲__init__.py的空文件:

    el@apollo:/home/el/foo5/herp$ touch __init__.py el@apollo:/home/el/foo5/herp$ ls __init__.py
  4. 新建一個目錄/ home / el / foo5 / herp / derp

  5. 在derp下,製做另外一個__init__.py文件:

    el@apollo:/home/el/foo5/herp/derp$ touch __init__.py el@apollo:/home/el/foo5/herp/derp$ ls __init__.py
  6. 在/ home / el / foo5 / herp / derp下,建立一個名爲yolo.py的新文件。

    def skycake(): print "SkyCake evolves to stay just beyond the cognitive reach of " + "the bulk of men. SKYCAKE!!"
  7. 關鍵時刻,將新文件/home/el/foo5/main.py放入其中;

    from herp.derp.yolo import skycake skycake()
  8. 運行:

    el@apollo:/home/el/foo5$ python main.py SkyCake evolves to stay just beyond the cognitive reach of the bulk of men. SKYCAKE!!

    空的__init__.py文件向python解釋器傳達了開發人員打算將此目錄做爲可導入包的信息。

若是您想看到個人帖子,關於如何在目錄下包含全部.py文件,請參見此處: https : //stackoverflow.com/a/20753073/445131


#4樓

importlib是Python中最近新增的功能,用於以編程方式導入模塊。 它只是__import__的包裝器,請參見https://docs.python.org/3/library/importlib.html#module-importlib

import importlib

moduleName = input('Enter module name:')
importlib.import_module(moduleName)

更新:如下答案已過期 。 使用上面的最新替代方法。

  1. 只需import file不帶'.py'擴展名的import file便可。

  2. 您能夠經過添加一個名爲__init__.py的空文件來將文件夾標記爲包。

  3. 您可使用__import__函數。 它以模塊名稱做爲字符串。 (一樣:模塊名稱不帶「 .py」擴展名。)

    pmName = input('Enter module name:') pm = __import__(pmName) print(dir(pm))

    鍵入help(__import__)以得到更多詳細信息。


#5樓

導入文檔..-連接以供參考

__init__.py文件是使Python將目錄視爲包含程序包所必需的,這樣作是爲了防止具備共同名稱(例如字符串)的目錄無心間隱藏了稍後在模塊搜索路徑中出現的有效模塊。

__init__.py只能是一個空文件,但它也能夠執行包的初始化代碼或設置__all__變量。

mydir/spam/__init__.py
mydir/spam/module.py
import spam.module
or
from spam import module
相關文章
相關標籤/搜索