2011-12-23 274 views
1

我對這個問題猶豫不決,因爲我看到了類似的問題,並且答案過於複雜。我實際上想回答的問題是因爲「模糊」和「不是真正的問題」而被封閉的,所以我會盡可能具體。如何從文件導入python代碼?

我在名爲「line.py」的文件中有一個名爲「line」的對象。我想創建另一個繼承自「line」,名爲「line_segment」的對象,並將其放入同一目錄中名爲「line_segment.py」的文件中。

path_finding_lib/ 
    line.py 
    line_segment.py 
    a_star.py 

問題是,我似乎無法找到一種方式,使用「line.py」從內部「line_segment.py」的代碼而不附加字符串系統PATH變量和類似的東西。

是不是有辦法從類似的文件路徑導入?如果不是,爲什麼不呢?

+0

這仍然過於模糊的過程:究竟是什麼出了問題,如果你只是使用''line_segment.py'進口line'?你如何運行程序,即在哪個文件執行「開始」? – 2011-12-23 06:39:29

回答

3

雖然你可以追加到Python路徑中使用特定文件:

import sys 
sys.path.append('pathtoModule') 

如果它們是在同一文件夾,(不是一個模塊,因爲你缺少INIT的.py),你從線路模塊做簡單的導入:

from line import Line 
class LineSegment(line): 

命名約定提供下劃線和小寫的模塊,資本化類: http://www.python.org/dev/peps/pep-0008/

它是非標準的,如果您動態追加到項目中的python路徑,可能會導致麻煩,因爲它會導致對象比較中的錯誤。

如果你有一個對象聲明如下:

path_finding_lib/ 
    line.py 
    line_segment.py 
    a_star.py 
    somemodule/ 
     afile.py 

如果你的線路模塊的進口和從å文件使用路徑somemodule.afile.SomeObject

這是不一樣的類從實例化對象實例化一個對象內å文件:

afile.SomeObject. 

如果å文件返回afile.SomeObject的一個實例,所述對象被平等於instanc相比e某些模塊。某些對象,它們將被認爲是不相等的。 即

somemodule.afile.SomeObject == afile.SomeObject 
==> False 
+0

謝謝,這非常有幫助。對不起,他也沒有使用變量名。我對python仍然很陌生,對命名約定並不熟悉(非常感謝鏈接)。 – user1003620 2011-12-23 04:41:15

0

因爲他們是在同一目錄下,創建一個名爲__init__.py一個空文件。這可以讓Python將你工作的目錄當作一個包來處理,並且你可以從這些其他文件中提取對象和方法。

1

在其他文件中使用python代碼的最簡單方法是使用import語句。

說,當你做

import xyz 

Python將試圖找到該文件xyz.py.它看起來到

  1. 的站點包文件夾(這是你的Python安裝目錄包含預安裝的模塊,如說的Django等的文件夾)在PYTHONPATH環境變量中提到
  2. 位置(或在的sys.path蟒蛇)
  3. 當前目錄

在你的情況,你的程序應該有下面這行

from line import line 

其中第一行是您的line.py文件,第二行是你的 類無論你想用線條對象繼承只需使用

class newline(line): 

美中不足的是你如何運行該程序。如果從path_finding_lib內運行(即當你的工作目錄是path_finding_lib和你做

python line_segment.py 

,它應該工作(您也可以選擇做一個空白文件初始化的.py在同一文件夾)。

如果從運行它說你的home目錄

~$ python /path_to/path_finding_lib line_segment.py 

它不會工作,這是因爲Python會搜索站點包,PYTHONPATH和當前目錄並沒有找到line.py.爲了能夠運行你運行它添加line.py的位置到PYTHONPATH

$export PYTHONPATH=/path_to/path_finding_lib 

來自世界各地,在那之前,你應該能夠運行它

注:我假設你有一個Linux ystem。對於Windows不幸的是我不知道修改PYTHONPATH