Hướng dẫn import from parent folder python - nhập từ thư mục mẹ python

Tôi cũng đã đăng một câu trả lời tương tự cho câu hỏi liên quan đến nhập khẩu từ các gói anh chị em. Bạn có thể thấy nó ở đây.

Giải pháp mà không có sys.path hack

Bản tóm tắt

  • Bọc mã vào một thư mục (ví dụ: ____10)
  • Tạo tập lệnh
        from setuptools import setup, find_packages
    
        setup(name='myproject', version='1.0', packages=find_packages())
    
    1 nơi bạn sử dụng setuptools.setup ().
  • PIP cài đặt gói ở trạng thái có thể chỉnh sửa với
        from setuptools import setup, find_packages
    
        setup(name='myproject', version='1.0', packages=find_packages())
    
    2
  • Nhập bằng
        from setuptools import setup, find_packages
    
        setup(name='myproject', version='1.0', packages=find_packages())
    
    3

Thành lập

Tôi giả sử cấu trúc thư mục giống như trong câu hỏi

.
└── ptdraft
    ├── __init__.py
    ├── nib.py
    └── simulations
        ├── __init__.py
        └── life
            ├── __init__.py
            └── life.py

Tôi gọi

    from setuptools import setup, find_packages

    setup(name='myproject', version='1.0', packages=find_packages())
4 là thư mục gốc và trong trường hợp của tôi, nó được đặt trong
    from setuptools import setup, find_packages

    setup(name='myproject', version='1.0', packages=find_packages())
5.

Các bước

  1. Thêm
        from setuptools import setup, find_packages
    
        setup(name='myproject', version='1.0', packages=find_packages())
    
    1 vào thư mục gốc - nội dung của
        from setuptools import setup, find_packages
    
        setup(name='myproject', version='1.0', packages=find_packages())
    
    1 có thể chỉ đơn giản là
    from setuptools import setup, find_packages

    setup(name='myproject', version='1.0', packages=find_packages())

Về cơ bản "bất kỳ"

    from setuptools import setup, find_packages

    setup(name='myproject', version='1.0', packages=find_packages())
1 sẽ hoạt động. Đây chỉ là một ví dụ làm việc tối thiểu.

  1. Sử dụng môi trường ảo

Nếu bạn quen thuộc với môi trường ảo, hãy kích hoạt một và bỏ qua bước tiếp theo. Việc sử dụng môi trường ảo không phải là hoàn toàn cần thiết, nhưng chúng thực sự sẽ giúp bạn về lâu dài (khi bạn có nhiều hơn 1 dự án đang diễn ra ..). Các bước cơ bản nhất là (chạy trong thư mục gốc)

  • Tạo env ảo
    •     from setuptools import setup, find_packages
      
          setup(name='myproject', version='1.0', packages=find_packages())
      
      9
  • Kích hoạt env ảo
    • PS C:\tmp\test_imports> python -m venv venv
      PS C:\tmp\test_imports> .\venv\Scripts\activate
      (venv) PS C:\tmp\test_imports>
      
      0 (Linux) hoặc
      PS C:\tmp\test_imports> python -m venv venv
      PS C:\tmp\test_imports> .\venv\Scripts\activate
      (venv) PS C:\tmp\test_imports>
      
      1 (thắng)
  • Vô hiệu hóa env ảo
    • PS C:\tmp\test_imports> python -m venv venv
      PS C:\tmp\test_imports> .\venv\Scripts\activate
      (venv) PS C:\tmp\test_imports>
      
      2 (Linux)

Để tìm hiểu thêm về điều này, chỉ cần Google ra "hướng dẫn Virtualenv" hoặc tương tự của Google. Bạn có thể không bao giờ cần bất kỳ lệnh nào khác ngoài việc tạo, kích hoạt và hủy kích hoạt.

Khi bạn đã tạo và kích hoạt một môi trường ảo, bảng điều khiển của bạn sẽ cho biết tên của môi trường ảo trong ngoặc đơn

PS C:\tmp\test_imports> python -m venv venv
PS C:\tmp\test_imports> .\venv\Scripts\activate
(venv) PS C:\tmp\test_imports>
  1. PIP Cài đặt dự án của bạn ở trạng thái có thể chỉnh sửa

Cài đặt gói cấp cao nhất của bạn

PS C:\tmp\test_imports> python -m venv venv
PS C:\tmp\test_imports> .\venv\Scripts\activate
(venv) PS C:\tmp\test_imports>
3 bằng
PS C:\tmp\test_imports> python -m venv venv
PS C:\tmp\test_imports> .\venv\Scripts\activate
(venv) PS C:\tmp\test_imports>
4. Bí quyết là sử dụng cờ
PS C:\tmp\test_imports> python -m venv venv
PS C:\tmp\test_imports> .\venv\Scripts\activate
(venv) PS C:\tmp\test_imports>
5 khi thực hiện cài đặt. Bằng cách này, nó được cài đặt ở trạng thái có thể chỉnh sửa và tất cả các chỉnh sửa được thực hiện cho các tệp .py sẽ được tự động bao gồm trong gói đã cài đặt.

Trong thư mục gốc, chạy

PS C:\tmp\test_imports> python -m venv venv
PS C:\tmp\test_imports> .\venv\Scripts\activate
(venv) PS C:\tmp\test_imports>
6 (lưu ý dấu chấm, nó là viết tắt của "thư mục hiện tại")

Bạn cũng có thể thấy rằng nó được cài đặt bằng cách sử dụng

PS C:\tmp\test_imports> python -m venv venv
PS C:\tmp\test_imports> .\venv\Scripts\activate
(venv) PS C:\tmp\test_imports>
7

(venv) PS C:\tmp\test_imports> pip install -e .
Obtaining file:///C:/tmp/test_imports
Installing collected packages: myproject
  Running setup.py develop for myproject
Successfully installed myproject
(venv) PS C:\tmp\test_imports> pip freeze
myproject==1.0
  1. Nhập khẩu bằng cách chi tiêu
    PS C:\tmp\test_imports> python -m venv venv
    PS C:\tmp\test_imports> .\venv\Scripts\activate
    (venv) PS C:\tmp\test_imports>
    
    8 cho mỗi lần nhập khẩu

Trong ví dụ này,

PS C:\tmp\test_imports> python -m venv venv
PS C:\tmp\test_imports> .\venv\Scripts\activate
(venv) PS C:\tmp\test_imports>
8 sẽ là
(venv) PS C:\tmp\test_imports> pip install -e .
Obtaining file:///C:/tmp/test_imports
Installing collected packages: myproject
  Running setup.py develop for myproject
Successfully installed myproject
(venv) PS C:\tmp\test_imports> pip freeze
myproject==1.0
0. Điều này có lợi thế là bạn sẽ không gặp phải các vụ va chạm tên với các tên mô -đun khác (từ Thư viện tiêu chuẩn Python hoặc Mô -đun bên thứ 3).


Ví dụ sử dụng

nib.py

def function_from_nib():
    print('I am the return value from function_from_nib!')

life.py

from ptdraft.nib import function_from_nib

if __name__ == '__main__':
    function_from_nib()

Chạy cuộc sống.py

(venv) PS C:\tmp\test_imports> python .\ptdraft\simulations\life\life.py
I am the return value from function_from_nib!

Không thể nhập tệp từ một thư mục python khác?

Hướng dẫn import from parent folder python - nhập từ thư mục mẹ python

Cách pythonic nhất để nhập một mô -đun từ một thư mục khác là đặt một tệp trống có tên __init__.py vào thư mục đó và sử dụng đường dẫn tương đối với ký hiệu dấu chấm. Ví dụ: một mô -đun trong thư mục chính sẽ được nhập từ .. Nhập mô -đun.

__ init __ py làm gì trong python?

Python3

Các tệp __init__.py được yêu cầu để làm cho các thư mục xử lý Python chứa tệp dưới dạng các gói. Điều này ngăn các thư mục có tên chung, chẳng hạn như chuỗi, vô tình ẩn các mô -đun hợp lệ xảy ra sau đó trên đường dẫn tìm kiếm mô -đun.

(venv) PS C:\tmp\test_imports> pip install -e .
Obtaining file:///C:/tmp/test_imports
Installing collected packages: myproject
  Running setup.py develop for myproject
Successfully installed myproject
(venv) PS C:\tmp\test_imports> pip freeze
myproject==1.0
3
(venv) PS C:\tmp\test_imports> pip install -e .
Obtaining file:///C:/tmp/test_imports
Installing collected packages: myproject
  Running setup.py develop for myproject
Successfully installed myproject
(venv) PS C:\tmp\test_imports> pip freeze
myproject==1.0
4
(venv) PS C:\tmp\test_imports> pip install -e .
Obtaining file:///C:/tmp/test_imports
Installing collected packages: myproject
  Running setup.py develop for myproject
Successfully installed myproject
(venv) PS C:\tmp\test_imports> pip freeze
myproject==1.0
5
(venv) PS C:\tmp\test_imports> pip install -e .
Obtaining file:///C:/tmp/test_imports
Installing collected packages: myproject
  Running setup.py develop for myproject
Successfully installed myproject
(venv) PS C:\tmp\test_imports> pip freeze
myproject==1.0
6
(venv) PS C:\tmp\test_imports> pip install -e .
Obtaining file:///C:/tmp/test_imports
Installing collected packages: myproject
  Running setup.py develop for myproject
Successfully installed myproject
(venv) PS C:\tmp\test_imports> pip freeze
myproject==1.0
7

Làm cách nào để nhập mô -đun từ thư mục trước?

Python3

Để nhập một mô -đun bằng cách sử dụng câu lệnh nhập, trước tiên chúng tôi sẽ phải khai báo thư mục một gói bằng cách thêm tệp __init__.py vào thư mục cha. Khi thư mục cha được khai báo một gói, chúng tôi có thể nhập mô -đun bằng cách tiếp cận gói tương đối.

def function_from_nib():
    print('I am the return value from function_from_nib!')
2

Làm thế nào để tôi tham khảo một thư mục phụ huynh trong Python?

Sử dụng hệ điều hành. hệ điều hành. đường dẫn. abspath () có thể được sử dụng để có được thư mục cha. Phương pháp này được sử dụng để có được phiên bản chuẩn hóa của đường dẫn.

Trong bài viết này, chúng tôi sẽ học cách nhập một mô -đun từ thư mục mẹ. Từ Python 3.3, việc tham khảo hoặc nhập một mô -đun trong thư mục cha không được phép, từ ví dụ dưới đây, bạn có thể hiểu rõ điều này.

Trong thư mục cha, chúng tôi có tệp phân chia, geek.py và trong thư mục con, chúng tôi có một tệp python có tên Temp.py, bây giờ hãy thử xem chúng tôi có thể nhập mô -đun GEEKS trong thư mục cha từ tệp Temp.py In các thư mục con.

Geek.py (Mô -đun trong thư mục cha)

(venv) PS C:\tmp\test_imports> pip install -e .
Obtaining file:///C:/tmp/test_imports
Installing collected packages: myproject
  Running setup.py develop for myproject
Successfully installed myproject
(venv) PS C:\tmp\test_imports> pip freeze
myproject==1.0
1
(venv) PS C:\tmp\test_imports> pip install -e .
Obtaining file:///C:/tmp/test_imports
Installing collected packages: myproject
  Running setup.py develop for myproject
Successfully installed myproject
(venv) PS C:\tmp\test_imports> pip freeze
myproject==1.0
2
parent directory:

Temp.py (tệp Python trong thư mục con)

(venv) PS C:\tmp\test_imports> pip install -e .
Obtaining file:///C:/tmp/test_imports
Installing collected packages: myproject
  Running setup.py develop for myproject
Successfully installed myproject
(venv) PS C:\tmp\test_imports> pip freeze
myproject==1.0
8
(venv) PS C:\tmp\test_imports> pip install -e .
Obtaining file:///C:/tmp/test_imports
Installing collected packages: myproject
  Running setup.py develop for myproject
Successfully installed myproject
(venv) PS C:\tmp\test_imports> pip freeze
myproject==1.0
9
def function_from_nib():
    print('I am the return value from function_from_nib!')
0
def function_from_nib():
    print('I am the return value from function_from_nib!')
1

Như chúng ta đã thảo luận trước đó, không thể nhập một mô -đun từ thư mục cha, vì vậy điều này dẫn đến một lỗi như thế này.

Traceback (cuộc gọi gần đây nhất cuối cùng):

& nbsp; Tệp C:append() method. It is a built-in function of the sys module that can be used with a path variable to add a specific path for interpreters to search. The following example shows how this can be done.

Python3

def function_from_nib():
    print('I am the return value from function_from_nib!')
0
def function_from_nib():
    print('I am the return value from function_from_nib!')
4

def function_from_nib():
    print('I am the return value from function_from_nib!')
5
def function_from_nib():
    print('I am the return value from function_from_nib!')
6
(venv) PS C:\tmp\test_imports> pip install -e .
Obtaining file:///C:/tmp/test_imports
Installing collected packages: myproject
  Running setup.py develop for myproject
Successfully installed myproject
(venv) PS C:\tmp\test_imports> pip freeze
myproject==1.0
7

(venv) PS C:\tmp\test_imports> pip install -e .
Obtaining file:///C:/tmp/test_imports
Installing collected packages: myproject
  Running setup.py develop for myproject
Successfully installed myproject
(venv) PS C:\tmp\test_imports> pip freeze
myproject==1.0
8
def function_from_nib():
    print('I am the return value from function_from_nib!')
9
def function_from_nib():
    print('I am the return value from function_from_nib!')
0
from ptdraft.nib import function_from_nib

if __name__ == '__main__':
    function_from_nib()
1

from ptdraft.nib import function_from_nib

if __name__ == '__main__':
    function_from_nib()
2

Output:

This method in geeks module.......bye

Phương pháp 2: Nhập từ thư mục cha bằng phương thức Os.Path.Abpath () os.path.abspath() method

Ở đây chúng tôi sẽ sử dụng mô -đun SYS cũng như mô -đun đường dẫn để lấy thư mục và đặt đường dẫn trực tiếp đến mô -đun cần thiết.

Cú pháp: OS.Path.Abspath (Path) os.path.abspath(path)

Tham số: Đường dẫn: Một đối tượng giống như đường dẫn biểu thị đường dẫn hệ thống tệp.
Path: A path-like object representing a file system path.

Loại trả về: Phương thức này trả về một phiên bản chuẩn hóa của đường dẫn đường dẫn. This method returns a normalized version of the pathname path.

Đầu tiên chúng tôi sẽ nhận được tên của thư mục trong đó tệp temp.py hiện đang sử dụng path.Path (__ tệp __).

Python3

def function_from_nib():
    print('I am the return value from function_from_nib!')
0
from ptdraft.nib import function_from_nib

if __name__ == '__main__':
    function_from_nib()
4

def function_from_nib():
    print('I am the return value from function_from_nib!')
0
def function_from_nib():
    print('I am the return value from function_from_nib!')
4

from ptdraft.nib import function_from_nib

if __name__ == '__main__':
    function_from_nib()
7
from ptdraft.nib import function_from_nib

if __name__ == '__main__':
    function_from_nib()
8
from ptdraft.nib import function_from_nib

if __name__ == '__main__':
    function_from_nib()
9

(venv) PS C:\tmp\test_imports> python .\ptdraft\simulations\life\life.py
I am the return value from function_from_nib!
0

(venv) PS C:\tmp\test_imports> pip install -e .
Obtaining file:///C:/tmp/test_imports
Installing collected packages: myproject
  Running setup.py develop for myproject
Successfully installed myproject
(venv) PS C:\tmp\test_imports> pip freeze
myproject==1.0
8
def function_from_nib():
    print('I am the return value from function_from_nib!')
9
def function_from_nib():
    print('I am the return value from function_from_nib!')
0
from ptdraft.nib import function_from_nib

if __name__ == '__main__':
    function_from_nib()
1

from ptdraft.nib import function_from_nib

if __name__ == '__main__':
    function_from_nib()
2

Output:

 This method in geeks module.......bye

Phương pháp 2: Nhập từ thư mục cha bằng phương thức Os.Path.Abpath ()os.path.dirname method

Ở đây chúng tôi sẽ sử dụng mô -đun SYS cũng như mô -đun đường dẫn để lấy thư mục và đặt đường dẫn trực tiếp đến mô -đun cần thiết.

Cú pháp: OS.Path.Abspath (Path) os.path.dirname(path)

Tham số: Đường dẫn: Một đối tượng giống như đường dẫn biểu thị đường dẫn hệ thống tệp.
path: A path-like object representing a file system path.

Loại trả về: Phương thức này trả về một phiên bản chuẩn hóa của đường dẫn đường dẫn. This method returns a string value which represents the directory name from the specified path.

Đầu tiên chúng tôi sẽ nhận được tên của thư mục trong đó tệp temp.py hiện đang sử dụng path.Path (__ tệp __).

Python3

def function_from_nib():
    print('I am the return value from function_from_nib!')
0
def function_from_nib():
    print('I am the return value from function_from_nib!')
4

def function_from_nib():
    print('I am the return value from function_from_nib!')
0
from ptdraft.nib import function_from_nib

if __name__ == '__main__':
    function_from_nib()
4

from ptdraft.nib import function_from_nib

if __name__ == '__main__':
    function_from_nib()
7
from ptdraft.nib import function_from_nib

if __name__ == '__main__':
    function_from_nib()
8
from ptdraft.nib import function_from_nib

if __name__ == '__main__':
    function_from_nib()
9

Phương pháp 3: Nhập từ thư mục cha bằng phương thức OS.Path.Dirname

This method in geeks module.......bye
6

Ở đây chúng tôi sẽ sử dụng mô -đun SYS cũng như mô -đun HĐH để lấy thư mục (dòng điện cũng như cha mẹ) và đặt đường dẫn trực tiếp đến mô -đun cần thiết.

def function_from_nib():
    print('I am the return value from function_from_nib!')
2

Output:

Hướng dẫn import from parent folder python - nhập từ thư mục mẹ python


Không thể nhập tệp từ một thư mục python khác?

Cách pythonic nhất để nhập một mô -đun từ một thư mục khác là đặt một tệp trống có tên __init__.py vào thư mục đó và sử dụng đường dẫn tương đối với ký hiệu dấu chấm. Ví dụ: một mô -đun trong thư mục chính sẽ được nhập từ .. Nhập mô -đun.place an empty file named __init__.py into that folder and use the relative path with the dot notation. For example, a module in the parent folder would be imported with from .. import module .

__ init __ py làm gì trong python?

Các tệp __init__.py được yêu cầu để làm cho các thư mục xử lý Python chứa tệp dưới dạng các gói. Điều này ngăn các thư mục có tên chung, chẳng hạn như chuỗi, vô tình ẩn các mô -đun hợp lệ xảy ra sau đó trên đường dẫn tìm kiếm mô -đun.make Python treat directories containing the file as packages. This prevents directories with a common name, such as string , unintentionally hiding valid modules that occur later on the module search path.

Làm cách nào để nhập mô -đun từ thư mục trước?

Để nhập một mô -đun bằng cách sử dụng câu lệnh nhập, trước tiên chúng tôi sẽ phải khai báo thư mục một gói bằng cách thêm tệp __init__.py vào thư mục cha.Khi thư mục cha được khai báo một gói, chúng tôi có thể nhập mô -đun bằng cách tiếp cận gói tương đối.declare the directory a package by adding the __init__.py file in the parent directory. Once the parent directory is declared a package, we can import the module using the relative package approach.

Làm thế nào để tôi tham khảo một thư mục phụ huynh trong Python?

Sử dụng hệ điều hành.hệ điều hành.đường dẫn.abspath () có thể được sử dụng để có được thư mục cha.Phương pháp này được sử dụng để có được phiên bản chuẩn hóa của đường dẫn.os. path. abspath() can be used to get the parent directory. This method is used to get the normalized version of the path.