반응형

출처: https://itholic.github.io/linux-cd/

리눅스 cd (change directory) 명령어 기초

cd 명령어를 통해 경로를 이동할 때, 두 가지 방법을 사용할 수 있다.

바로 절대경로와 상대경로인데, 각각의 차이점을 알아보자.

현재 디렉토리가 /a/b/c/d 로 되어있다고 가정하자

우선 경로를 a의 하위 디렉토리인 b로 이동해보자.

이동 후에는 pwd로 현재 위치를 확인하는 습관을 들이는 것이 좋다.

cd /a/b/
pwd

이제, 현재 위치 (/a/b/)를 기준으로 여러가지 방법으로 경로를 이동하며

절대경로와 상대경로에 대한 감을 잡을 것이다.

절대경로

절대경로란 최상위 디렉토리 (/)부터 시작해서 목표 디렉토리까지 가는 경로를 전부 기술하는 방식이다.

절대경로로 경로를 기술할 때에는 항상 맨 앞에 최상위 디렉토리 (/)가 붙는다는 것을 명심하자.

절대경로를 이용하여 b 디렉토리에서 d 디렉토리로 이동해보자.

cd /a/b/c/d/
pwd

그리고 다시 b 경로로 이동해보자.

cd /a/b/
pwd

이처럼 절대경로를 통해 경로 이동을 할 때에는 현재 위치에 상관 없이 똑같은 명령어를 입력하여 이동하게 된다.

절대 경로는 어렵지 않다. 그냥 최상위부터 해당 디렉토리가 위치하는 곳 까지의 경로를 차례대로 적어주면 되기 때문이다.

상대경로

상대경로는 ‘현재 자신이 있는 위치를 기준으로’ 이동을 하는 것이다.

그리고 현재 자신이 있는 위치는 .(마침표) 로 표기한다.

그럼 이번에는 상대경로를 활용하여 b 에서 d로 이동해보자.

설명이 와닿지 않는다면 아래의 예제로 확인하자.

cd ./c/d/
pwd

/a/b/c/d/ 중에 /a/b/ 까지의 경로는 현재 자신의 위치이므로 . 으로 표기했다.

그리고 나머지 경로 /c/d/ 를 입력하여 경로 이동을 한 것을 볼 수 있다.

이번엔 상대경로를 활용하여 다시 b 경로로 이동해보자.

이전(상위) 디렉토리는 .. 으로 표기한다.

b 디렉토리로 이동을 위해서는 상위 디렉토리로 ‘2회’ 이동이 필요하다.

예제로 확인하자.

cd ../../
pwd

상대경로에 대한 감이 좀 잡힐지 모르겠다.

그럼 이번에는 절대경로와 상대경로를 각각 활용하여 r 경로로 이동해보자

r 경로는 /q/w/e/r/ 에 위치해있다.

(저번 포스팅 마지막 부분의 실습 디렉토리 생성 참조)

절대경로는 무조건 최상위부터 시작하는 경로이므로 현재 위치를 고려할 필요가 없다.

다음과 같이 입력하면 r 경로로 이동된다.

(절대 경로는 일단 눈으로만 확인하고 상대경로로 실습해보자. )

cd /q/w/e/r/

상대경로로 이동할 때에는 현재 경로인 b 부터 이동하는 모든 과정을 고려해야한다.

다음과 같은 순서로 이동이 필요하다.

  1. a 로 이동 → ..
  2. / (최상위 디렉토리)로 이동 → ..
  3. q로 이동 → /q
  4. w로 이동 → /w
  5. e로 이동 → /e
  6. r로 이동 → /r

이를 한 줄의 명령어로 입력하면 다음과 같다.

(맨 마지막의 슬래쉬 (/)는 입력해도 되고 안해도 되지만 ‘디렉토리’라는 것을 확실히 나타내기 위해 편의상 입력한다)

cd ../../q/w/e/r/
pwd

실습을 하며 느꼈겠지만, 절대경로와 상대경로는 어떤 방법이 무조건 더 좋다고 할 수 없다.

그 때 그 때 상황에 따라 절대경로가 편할 때도 있고, 상대경로가 편할 때도 있는 것이다.

예를 들어,

/a/b/ 에서 d 로 이동 할 때에는 절대경로인 /a/b/c/d/ 보다는 상대경로인 ./c/d/ 로 이동하는 것이 편하고.

/a/b/ 에서 r 로 이동 할 때에는 절대경로인 /q/w/e/r/이 상대경로인 ../../q/w/e/r/ 보다 편한 것 처럼 말이다.

절대경로와 상대경로를 활용하여 이곳 저곳으로 이동하는 연습을 몇 번만 해보면 금방 손에 익숙해질것이다.

*주의사항*

만약 현재 위치가 b라고 가정할 때, ./  /a/b/ 를 의미하지만, 점(.) 하나를 빼 먹으면 최상위 디렉토리 (/)를 의미하게 된다.

디렉토리 이동 시에는 큰 상관이 없지만,

나중에 삭제나 이동 명령어를 사용 할 때에는 작은 실수가 돌이킬 수 없는 치명적인 결과를 낳을 수도 있기 때문에 유의해야한다.

현재 경로의 파일을 삭제하려다가 최상위 경로의 파일이 모두 날아갈 수 있기 때문이다.

 

반응형
반응형

출처: https://itholic.github.io/linux-basic-command/

리눅스를 사용할때 숨쉬듯(?) 타이핑하는 기본 명령어들을 정리해봤다.

처음 리눅스를 접하는 사람들에게 조금이나마 도움이 되었으면 좋겠다.

 

모든 명령어는 명령어 뒤에 --help 옵션을 주면 자세한 사용 방법이 나온다.

예를들어 ls 명령어의 자세한 사용 방법과 모든 옵션을 알고싶으면 ls –help를 입력하면 된다.

 

따라서 모든 옵션을 상세하게 다루기보단,

실무를 하며 실제로 자주 사용하는 명령어와 옵션 위주로 그냥 쭉~ 나열해봤다.

물론 그래봤자 이제 2년 남짓한 경력이고, 프로젝트마다 자주 사용하는 명령어와 옵션은 다를 수 있다.

 

pwd (print working directory)

현재 작업중인 디렉토리 정보 출력

$ pwd
/home/itholic

 

cd (change directory)

경로 이동

절대 경로와 상대 경로로 이동 가능하다.

절대 경로와 상대 경로에 대해 더 자세히 알고싶다면 해당 포스팅 참조

$ cd /home/itholic/mydir
$ pwd
/home/itholic/mydir


$ cd ..
$ pwd
/home/itholic

 

ls (list)

디렉토리 목록 확인

$ ls
testfile1  testfile2  testfile3


$ ls -l
total 0
-rw-r--r-- 1 itholic 197121 0 11월  6 22:08 testfile1
-rw-r--r-- 1 itholic 197121 0 11월  6 22:08 testfile2
-rw-r--r-- 1 itholic 197121 0 11월  6 22:08 testfile3


$ ls -a
./  ../  testfile1  testfile2  testfile3


$ ls -al
total 4
drwxr-xr-x 1 itholic 197121 0 11월  6 22:08 ./
drwxr-xr-x 1 itholic 197121 0 11월  6 22:08 ../
-rw-r--r-- 1 itholic 197121 0 11월  6 22:08 testfile1
-rw-r--r-- 1 itholic 197121 0 11월  6 22:08 testfile2
-rw-r--r-- 1 itholic 197121 0 11월  6 22:08 testfile3

 

cp (copy)

파일 혹은 디렉토리를 복사

디렉토리를 복사할때는 -r 옵션을 주어야함

$ ls
testdir/  testfile


$ cp testfile1 testfile_cp
$ ls
testdir/  testfile  testfile_cp


$ cp -r testdir testdir_cp
$ ls
testdir/  testdir_cp/  testfile  testfile_cp

 

mv (move)

파일 혹은 디렉토리 이동

실제로 원하는 위치로 이동할때도 사용하지만, 이름을 변경하는 용도로도 사용한다.

cp와는 달리 디렉토리를 이동할때도 별다른 옵션이 필요 없다.

$ ls
testdir/  testfile


$ mv testfile testfile_mv
$ ls
testdir/  testfile_mv


$ mv testfile_mv testdir/
$ ls
testdir/


$ ls testdir/
testfile

 

mkdir (make directory)

디렉토리 생성

-p 옵션을 주면 하위 디렉토리까지 한 번에 생성 가능

아래 예제중 ls -R 옵션은 디렉토리의 하위목록까지 전부 보여주는 옵션인데,

내 경우 실제로 많이 사용하진 않아서 ls 명령어에서 따로 설명하진 않았다.

mkdir -p 옵션 예제에서 실제로 하위디렉토리가 생성되었다는 것을 보여주기 위해 사용하였다.

$ ls
testfile


$ mkdir testdir
$ ls
testdir/  testfile


$ mkdir -p a/b/c/d/e/
$ ls -R a/
a/:
b/

a/b:
c/

a/b/c:
d/

a/b/c/d:
e/

a/b/c/d/e:

 

rm (remove)

파일이나 디렉토리를 삭제

디렉토리를 삭제할때는 r 옵션을 주어야 한다.

-f 옵션을 주면 사용자에게 삭제 여부를 묻지 않고 바로 삭제한다.

디렉토리를 삭제할 때에는 하위 디렉토리까지 모두 삭제되므로 유의하자.

$ ls
testdir/  testfile1  testfile2


$ rm -f testfile1
$ ls
testdir/  testfile2


$ rm -rf testdir/
$ ls
testfile2

 

touch

파일이나 디렉토리의 최근 업데이트 일자를 현재 시간으로 변경한다.

최근 업데이트 일자는 ls -l 명령을 통해 확인할 수 있다.

아래 예제에서 ‘11월 6 22:08’ 이라고 쓰여진 부분이다.

파일이나 디렉토리가 존재하지 않으면 빈 파일을 만든다.

$ ls -l
total 0
-rw-r--r-- 1 itholic 197121 0 11월  6 22:08 testfile1


$ touch testfile1
$ ls -l
total 0
-rw-r--r-- 1 itholic 197121 0 11월  6 22:43 testfile1


$ touch testfile2
$ ls -l
total 0
-rw-r--r-- 1 itholic 197121 0 11월  6 22:43 testfile1
-rw-r--r-- 1 itholic 197121 0 11월  6 22:44 testfile2

 

cat (concatenate)

cat 명령은 활용 방법이 꽤나 다양하다.

단순히 파일의 내용을 출력할 수도 있고,

파일 여러개를 합쳐서 하나의 파일로 만들 수도 있다.

그리고 기존 한 파일의 내용을 다른 파일에 덧붙일수도 있다.

새로운 파일을 만들때에도 사용된다.

file1, file2, file3 파일에는 각각 간단하게 숫자 1, 2, 3 이 적혀있다.

$ ls
file1  file2  file3


$ cat file1
1


$ cat file2
2


$ cat file3
3


$ cat file1 file2 > file1_2
$ ls
file1  file1_2  file2  file3


$ cat file1_2
1
2


$ cat file1 >> file2
$ cat file2
2
1


$ cat > file4
hello
world
(작성이 끝나면 ctrl +d 로 파일 저장)


$ cat file4
hello
world

 

파일의 앞부분을 보고싶은 줄 수만큼 보여준다.

옵션을 지정하지 않으면 파일 상위 10줄을 보여준다.

$ cat testfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15


$ head -3 testfile
1
2
3


$ head testfile
1
2
3
4
5
6
7
8
9
10

 

tail

파일의 뒷부분을 보고싶은 줄 수만큼 보여준다.

옵션을 지정하지 않으면 파일 하위 10줄을 보여준다.

참고로 -F 옵션을 주고 실행하면,

파일 내용을 화면에 계속 띄워주고 파일이 변하게되면 새로운 업데이트된 내용을 갱신해준다.

주로 실시간으로 내용이 추가되는 로그파일을 모니터링할때 유용하게 사용한다.

$ cat testfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15


$ tail -3 testfile
13
14
15


$ tail testfile
6
7
8
9
10
11
12
13
14
15


$ tail -F testfile
6
7
8
9
10
11
12
13
14
15
(명령어가 종료되지 않고 계속 해당 화면을 출력하며, 파일 내용 변경시 자동으로 갱신해준다)

 

find

특정 파일이나 디렉토리를 검색한다

사용법이 앞의 명령어들에비해 살짝 복잡하므로, 기본 사용법을 언급하자면 다음과 같다.

find [검색경로] -name [파일명]

파일명은 직접 풀 네임을 입력해도 되지만,

다음 예제처럼 특정 조건을 적용해 검색할수도 있다.

나같은 경우 주로 특정 확장자명을 찾기 위해 사용한다.

$ ls
dir1/  dir3/  file1  file3  picture1.jpg  picture3.jpg
dir2/  dir4/  file2  file4  picture2.jpg  picture4.jpg


$ find ./ -name 'file1'
./file1


$ find ./ -name "*.jpg"
./picture1.jpg
./picture2.jpg
./picture3.jpg
./picture4.jpg

확장자가 .jpg인 파일을 찾았다.

하지만 여기서 그치지 않고, 확장자가 .jpg인 파일만 찾아서 바로 삭제할수도 있다.

exec 옵션을 사용해 다음과 같이 처리하면 된다.

$ find ./ -name "*.jpg" -exec rm {} \;
$ ls
dir1/  dir2/  dir3/  dir4/  file1  file2  file3  file4

그리고 다음과 같이 -type 옵션을 주면, 디렉토리나 파일만 지정해서 검색할수도 있다.

$ find ./ -type d
./
./dir1
./dir2
./dir3
./dir4


$ find ./ -type f
./file1
./file2
./file3
./file4

다음과 같이 wc -l 옵션과 같이 사용하면,

특정 디렉토리에 find 조건에 맞는 결과 값이 몇개 존재하는지 숫자로 간편히 알아볼 수 있다.

$ find ./ -type f | wc -l
4

지금처럼 파일 갯수가 4개밖에 없을땐 그냥 일일이 세면 되지만,

파일이 수백, 수천, 수십만 개가 있을땐 아주 유용하다.

 

마지막으로 아래 내용은 명령어가 조금 복잡하지만, 알아두면 유용해서 적어둔다.

특정 조건에 해당하는 파일들의 내용을 전부 찾아서 바꾸는 것이다.

예를들어 10만개의 파일이 있는데,

그 중에 확장자가 .txt인 파일만 찾아내고,

txt 파일 안에 있는 ‘hi’ 라는 문자열을 ‘hello’로 바꾸려면 다음과 같이 하면 된다.

find ./ -name "*.txt" -exec sed -i 's/hi/hello/g' {} \;

짧게 설명하자면,

다음 sed 명령어는 testfile1.txt 이라는 파일의 모든 ‘hi’ 라는 문자열을 ‘hello’로 바꾸는 역할을 한다.

sed -i 's/hi/hello/g' testfile1.txt

이를 find 명령과 조합하여 조건에 맞는 모든 파일에 대해 해당 명령을 수행할 수 있도록 응용한 것이다.

반응형
반응형

출처: https://rfriend.tistory.com/289

 

지난번 포스팅에서는 다차원 행렬 ndarray에 축을 추가하는 방법으로 arr(:, np.newaxis, :), np.tile() 을 소개했었습니다.

 

이번 포스팅에서는 행렬의 행과 열을 바꾸기, 행렬의 축을 바꾸는 방법을 알아보겠습니다.  선형대수에서 보면 '전치행렬(transpose matrix)'이라는 특수한 형태의 행렬이 있는데요, 이번 포스팅이 바로 그겁니다. 행렬의 내적(inner product) 구할 때 aT*a 처럼 전치행렬과 원래 행렬을 곱할 때 전치행렬(aT)를 씁니다.

 

 

Python의 NumPy 로 부터 행렬 전치를 위해

 

 - a.T attribute

 - np.transpose(a) method

 - np.swapaxes(a, 0, 1) method

 

의 3가지 방법을 사용할 수 있습니다.

 

 

 

a.T attrbute, np.transpose() method, np.swapaxes() method 각각에 대해 2차원 행렬을 전치하는 단한 예를 들어보겠습니다.

 

 

  (1-1) Transposing 2 D array : a.T attribute

 



In [1]: import numpy as np


In [2]: a = np.arange(15).reshape(3, 5)


In [3]: a
Out[3]:
array([[ 0,  1,  2,  3,  4],
        [ 5,  6,  7,  8,  9],
        [10, 11, 12, 13, 14]])





# (1-1) transposing 2D array : T attribute

In [4]: a.T
Out[4]:
array([[ 0,  5, 10],
        [ 1,  6, 11],
        [ 2,  7, 12],
        [ 3,  8, 13],
        [ 4,  9, 14]])



 

 

 

 

  (1-2) Transposing 2D array : np.transpose() method

 



In [5]: a
Out[5]:
array([[ 0,  1,  2,  3,  4],
        [ 5,  6,  7,  8,  9],
        [10, 11, 12, 13, 14]])





# (1-2) transpose method : numpy.transpose(a, axes=None)

In [6]: np.transpose(a)
Out[6]:
array([[ 0,  5, 10],
        [ 1,  6, 11],
        [ 2,  7, 12],
        [ 3,  8, 13],
        [ 4,  9, 14]])



 

 

 

 

  (1-3) Transposing 2D array : np.swapaxes() method

 



In [7]: a
Out[7]:
array([[ 0,  1,  2,  3,  4],
        [ 5,  6,  7,  8,  9],
        [10, 11, 12, 13, 14]])





# (1-3) swapaxes method : numpy.swapaxes(a, axis1, axis2)

In [8]: np.swapaxes(a, 0, 1)
Out[8]:
array([[ 0,  5, 10],
        [ 1,  6, 11],
        [ 2,  7, 12],
        [ 3,  8, 13],
        [ 4,  9, 14]])



 

 

 

 

이쯤에서 NumPy의 np.dot() 으로 행렬 내적 (inner product, aT*a) 계산해볼까요?

 



In [9]: np.dot(a.T, a)
Out[9]:
array([[125, 140, 155, 170, 185],
        [140, 158, 176, 194, 212],
        [155, 176, 197, 218, 239],
        [170, 194, 218, 242, 266],
        [185, 212, 239, 266, 293]])





In [10]: np.dot(np.transpose(a), a)
Out[10]:
array([[125, 140, 155, 170, 185],
        [140, 158, 176, 194, 212],
        [155, 176, 197, 218, 239],
        [170, 194, 218, 242, 266],
        [185, 212, 239, 266, 293]])



In [11]: np.dot(np.swapaxes(a, 0, 1), a)
Out[11]:
array([[125, 140, 155, 170, 185],
        [140, 158, 176, 194, 212],
        [155, 176, 197, 218, 239],
        [170, 194, 218, 242, 266],
        [185, 212, 239, 266, 293]])


 

 

 

2차원 행렬로 전치에 대한 맛을 봤으니, 이제 3차원 행렬의 축을 바꿔보는 것으로 난이도를 높여보겠습니다.  np.transpose() 와 np.swapaxes() method는 전치시키려고 하는 축을 입력해줘야 하는데요, 조금 조심해서 사용해야 합니다.

 

  (2-1) Transposing 3D array : a.T attribute

 



In [12]: b = np.arange(24).reshape(2, 3, 4)


In [13]: b
Out[13]:
array([[[ 0,  1,  2,  3],
         [ 4,  5,  6,  7],
         [ 8,  9, 10, 11]],

        [[12, 13, 14, 15],
         [16, 17, 18, 19],
         [20, 21, 22, 23]]])





In [14]: b.T
Out[14]:
array([[[ 0, 12],
         [ 4, 16],
         [ 8, 20]],

        [[ 1, 13],
         [ 5, 17],
         [ 9, 21]],

        [[ 2, 14],
         [ 6, 18],
         [10, 22]],

        [[ 3, 15],
         [ 7, 19],
         [11, 23]]])





In [15]: b.T.shape
Out[15]: (4, 3, 2)
 

 

 

 

  (2-2) Transposing 3D array : np.transpose() method

 

np.transpose() method는 축을 바꾸고 싶은 위치, 순서를 분석가가 마음대로 지정할 수 있다는 측면에서 T attribute 보다 자유도가 높습니다. (처음엔 좀 헷갈리고 이해가 잘 안가는 면도 있지만요)

 



# shape (2, 3, 4)
In [16]: b
Out[16]:
array([[[ 0,  1,  2,  3],
         [ 4,  5,  6,  7],
         [ 8,  9, 10, 11]],

        [[12, 13, 14, 15],
         [16, 17, 18, 19],
         [20, 21, 22, 23]]])





# shape(2, 3, 4) => shape (4, 3, 2)


In [17]: np.transpose(b)
Out[17]:
array([[[ 0, 12],
         [ 4, 16],
         [ 8, 20]],

        [[ 1, 13],
         [ 5, 17],
         [ 9, 21]],

        [[ 2, 14],
         [ 6, 18],
         [10, 22]],

        [[ 3, 15],
         [ 7, 19],
         [11, 23]]])







# shape(2, 3, 4) => shape (4, 3, 2)


In [18]: np.transpose(b, (2, 1, 0))
Out[18]:
array([[[ 0, 12],
         [ 4, 16],
         [ 8, 20]],

        [[ 1, 13],
         [ 5, 17],
         [ 9, 21]],

        [[ 2, 14],
         [ 6, 18],
         [10, 22]],

        [[ 3, 15],
         [ 7, 19],
         [11, 23]]])





In [19]: b.shape
Out[19]: (2, 3, 4)


In [20]: np.transpose(b).shape
Out[20]: (4, 3, 2)
 

 

 

 

  (2-3) Transposing 3D array : np.swapaxes() method

 



In [21]: b
Out[21]:
array([[[ 0,  1,  2,  3],
         [ 4,  5,  6,  7],
         [ 8,  9, 10, 11]],

        [[12, 13, 14, 15],
         [16, 17, 18, 19],
         [20, 21, 22, 23]]])





In [22]: b.shape
Out[22]: (2, 3, 4)



# shape(2, 3, 4) => shape(4, 3, 2)



In [23]: np.swapaxes(b, 0, 2)
Out[23]:
array([[[ 0, 12],
         [ 4, 16],
         [ 8, 20]],

        [[ 1, 13],
         [ 5, 17],
         [ 9, 21]],

        [[ 2, 14],
         [ 6, 18],
         [10, 22]],

        [[ 3, 15],
         [ 7, 19],
         [11, 23]]])

 
In [24]: np.swapaxes(b, 0, 2).shape
Out[24]: (4, 3, 2)
 

 

 

 

np.transpose() 와 np.swapaxes() method를 사용해서 전치시키려는 축의 순서를 위의 예시와는 조금 다르게 바꿔서 해보겠습니다. 축(axes)의 순서를 바꿔서 입력해주면 됩니다. (말로 설명하기 좀 어려운데요, 아래 예와 위의 예를 유심히 살펴보시기 바랍니다)

 



In [25]: b
Out[25]:
array([[[ 0,  1,  2,  3],
         [ 4,  5,  6,  7],
         [ 8,  9, 10, 11]],

        [[12, 13, 14, 15],
         [16, 17, 18, 19],
         [20, 21, 22, 23]]])





In [26]: b.shape
Out[26]: (2, 3, 4)




# shape(2, 3, 4) => shape(3, 2, 4)

In [27]: np.transpose(b, (1, 0, 2)).shape
Out[27]: (3, 2, 4)


In [28]: np.transpose(b, (1, 0, 2))
Out[28]:
ararray([[[ 0,  1,  2,  3],
           [12, 13, 14, 15]],

          [[ 4,  5,  6,  7],
           [16, 17, 18, 19]],

          [[ 8,  9, 10, 11],
           [20, 21, 22, 23]]])



 

 

 

 

위의 [28]번 np.transpose(b, (1, 0, 2)) 와 똑같은 결과를 얻을 수 있는 방법으로 np.swapaxes(b, 1, 0)을 사용하면 됩니다.

 



In [29]: b
Out[29]:
array([[[ 0,  1,  2,  3],
         [ 4,  5,  6,  7],
         [ 8,  9, 10, 11]],

        [[12, 13, 14, 15],
         [16, 17, 18, 19],
         [20, 21, 22, 23]]])



In [30]: b.shape
Out[30]: (2, 3, 4)


In [31]: np.swapaxes(b, 1, 0).shape
Out[31]: (3, 2, 4)


In [32]: np.swapaxes(b, 1, 0)
Out[32]:
ararray([[[ 0,  1,  2,  3],
           [12, 13, 14, 15]],

          [[ 4,  5,  6,  7],
           [16, 17, 18, 19]],

          [[ 8,  9, 10, 11],
           [20, 21, 22, 23]]])

 

 

 

많은 도움 되었기를 바랍니다.



출처: https://rfriend.tistory.com/289 [R, Python 분석과 프로그래밍의 친구 (by R Friend)]

반응형
반응형

https://stackoverflow.com/questions/36230492/error-while-finding-spec-for-fibo-py-class-attributeerror-module-objec

python -m tt.py 

 

위와 같이 명령어 실행시 has no attribute '__path__' 에러 발생 할수 있다

python -m tt --> py를 제거하고 실행하면 된다. 

 

---

 

There are two ways you can run a Python 3 script.

  1. python fibo.py: The argument is the name of the .py file. Dots are part of the filename.
  2. python -m fibo: The argument is the name of a Python module, without .py. Dots indicate packages; fibo.py means "the module py in the package fibo."

This is a small distinction for a simple script like yours. But for something bigger or more complex, it has an important effect on the behavior of the import statement:

  1. The first form will cause import to search the directory where the .py file lives (and then search various other places including the standard library; see sys.path for a full list).
  2. The second form will make import search the current directory (and then various other places).

For this reason, under Python 3, the second form is required for most setups which involve packages (rather than just loose modules in a directory), since the parent package of the script may not be importable under the first form, which can cause things to break.

 

반응형

+ Recent posts