2011-06-28 14 views
7

Mam plik o nazwie test7.tcl:pytanie o źródła w Tcl

namespace eval ::dai { 
    variable name "ratzip" 
    variable birthday "1982" 
    proc hello {} { 
     variable name 
     variable birthday 
     puts "Hello, I am $name birthday is $birthday" 
    } 
} 

i chcę pozyskać tego pliku do innego pliku, zwanego test8.tcl w następujący sposób:

source test7.tcl 

::dai::hello 

ale daje mi błąd: nie można odczytać pliku "test7.tcl": brak takiego pliku lub katalogu

, ale oba pliki znajdują się w tym samym folderze, co się stało?

+0

Założę się, że nie uruchamiasz test8.tcl w ten sposób: 'tclsh test8.tcl' lub' source test8.tcl'. Zamiast tego jesteś w innym katalogu, więc nazwa pliku nie jest tym, czego oczekujesz. Diagnozuj za pomocą 'file normalize test7.tcl', aby sprawdzić, czy pełna nazwa pliku jest zgodna z oczekiwaniami. –

Odpowiedz

10

Source plik, który jest w tym samym katalogu co skrypt aktualnie wykonującego, użyj tego:

source [file join [file dirname [info script]] "test7.tcl"] 

pamiętać, że ta nie prac w obrębie procedur określonych wewnątrz zewnętrznego skryptu (test8.tcl w twoim przypadku), ponieważ są zwykle wywoływane po zakończeniu źródła. Jeśli tak jest w twoim przypadku, najprostszym rozwiązaniem jest zapisanie wyjścia info script w zmiennej w twoim zewnętrznym skrypcie (lub po prostu źródło wszystkich plików natychmiast zamiast leniwie dla najlepszego podejścia).

2

Nie trzeba określać ścieżki pliku, który ma być pozyskiwany względem ścieżki test8.tcl, ale w odniesieniu do bieżącego katalogu roboczego . Na przykład. użyć ścieżki bezwzględnej:

source /path/to/test7.tcl 
4

Korzystając source [file join [file dirname [info script]] test7.tcl] - w ten sposób będziesz Sourcing pliku docelowego poprzez jego pełną ścieżkę zbudowanego z pełną ścieżkę dostępu do pliku wykonującego source; to zadziała bez względu na to, jaki jest twój bieżący katalog podczas wykonywania.