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
1 nơi bạn sử dụng setuptools.setup [].from setuptools import setup, find_packages setup[name='myproject', version='1.0', packages=find_packages[]]
- PIP cài đặt gói ở trạng thái có thể chỉnh sửa với
2from setuptools import setup, find_packages setup[name='myproject', version='1.0', packages=find_packages[]]
- Nhập bằng
3from setuptools import setup, find_packages setup[name='myproject', version='1.0', packages=find_packages[]]
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
- Thêm
1 vào thư mục gốc - nội dung củafrom 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[]]
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.- 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
9from setuptools import setup, find_packages setup[name='myproject', version='1.0', packages=find_packages[]]
- Kích hoạt env ảo
0 [Linux] hoặcPS 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]PS C:\tmp\test_imports> python -m venv venv PS C:\tmp\test_imports> .\venv\Scripts\activate [venv] PS C:\tmp\test_imports>
- Vô hiệu hóa env ảo
2 [Linux]PS C:\tmp\test_imports> python -m venv venv PS C:\tmp\test_imports> .\venv\Scripts\activate [venv] PS C:\tmp\test_imports>
Để 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>
- 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
- Nhập khẩu bằng cách chi tiêu
8 cho mỗi lần nhập khẩuPS C:\tmp\test_imports> python -m venv venv PS C:\tmp\test_imports> .\venv\Scripts\activate [venv] PS C:\tmp\test_imports>
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!
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]
Python3
[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[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
7Temp.py [tệp Python trong thư mục con]
Python3
[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
9def 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!']
1def function_from_nib[]:
print['I am the return value from function_from_nib!']
2Như 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:
& nbsp; & nbsp; từ các chuyên viên nhập khẩu ParentDirectory
ModulenotFounderror: Không có mô -đun có tên ‘ParentDirectory
Bây giờ, hãy để Lừa học cách nhập một mô -đun từ thư mục Earpent: parent directory:
Để nhập một mô -đun, thư mục có mô -đun đó phải có mặt trên Pythonpath. Đây là một biến môi trường chứa danh sách các gói sẽ được tải bởi Python. Danh sách các gói trình bày trong PythonPath cũng có trong sys.path, vì vậy sẽ thêm đường dẫn thư mục cha vào sys.path.
Đối với công việc của chúng tôi, chúng tôi sử dụng ba cách tiếp cận khác nhau được giải thích dưới đây với sự trợ giúp của các ví dụ.
Phương pháp 1: Nhập từ thư mục mẹ bằng phương pháp sys.path
Ở đây chúng tôi sẽ sử dụng mô -đun SYS và đặt đường dẫn trực tiếp đến mô -đun cần thiết.
Thêm thư mục cha vào sys.path bằng phương thức append []. Đây là một chức năng tích hợp của mô-đun SYS có thể được sử dụng với một biến đường dẫn để thêm một đường dẫn cụ thể để các phiên dịch viên tìm kiếm. Ví dụ sau đây cho thấy làm thế nào điều này có thể được thực hiện.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!']
4def function_from_nib[]:
print['I am the return value from function_from_nib!']
0 [venv] PS C:\tmp\test_imports> python .\ptdraft\simulations\life\life.py
I am the return value from function_from_nib!
9This method in geeks module.......bye0
from ptdraft.nib import function_from_nib
if __name__ == '__main__':
function_from_nib[]
8 This method in geeks module.......bye2
from ptdraft.nib import function_from_nib
if __name__ == '__main__':
function_from_nib[]
2Output:
This method in geeks module.......bye
This method in geeks module.......bye
3from ptdraft.nib import function_from_nib
if __name__ == '__main__':
function_from_nib[]
8 This method in geeks module.......bye
5 os.path.abspath[] method
from ptdraft.nib import function_from_nib
if __name__ == '__main__':
function_from_nib[]
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!']
1Làm thế nào bạn có thể nhập tất cả các chức năng từ tệp Python trong thư mục trước? os.path.abspath[path]
Làm thế nào bạn có thể nhập tất cả các chức năng từ tệp Python trong thư mục trước ?.
Path: A path-like object representing a file system path.Phương pháp 1: Nhập từ thư mục cha bằng SYS. Phương pháp đường dẫn .. This method returns a normalized version of the pathname path.
Phương pháp 2: Nhập từ thư mục mẹ bằng hệ điều hành. đường dẫn. Phương pháp abspath [] ..
Python3
Phương pháp 3: Nhập từ thư mục mẹ bằng hệ điều hành. đường dẫn. Phương pháp Dirname ..
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Đó là cách thích hợp để nhập tất cả các chức năng có sẵn của một mô -đun Numpy?
[venv] PS C:\tmp\test_imports> python .\ptdraft\simulations\life\life.py
I am the return value from function_from_nib!
0This method in geeks module.......bye0
from ptdraft.nib import function_from_nib
if __name__ == '__main__':
function_from_nib[]
8 This method in geeks module.......bye2
from ptdraft.nib import function_from_nib
if __name__ == '__main__':
function_from_nib[]
2Output:
This method in geeks module.......bye
This method in geeks module.......bye
3from ptdraft.nib import function_from_nib
if __name__ == '__main__':
function_from_nib[]
8 This method in geeks module.......bye
5os.path.dirname method
from ptdraft.nib import function_from_nib
if __name__ == '__main__':
function_from_nib[]
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!']
1Cú pháp: OS.Path.Dirname [đường dẫn] 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 giá trị chuỗi đại diện cho tên thư mục từ đường dẫn được chỉ định. 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 thư mục hiện tại bằng cách sử dụng Os.Path.Dirname [Os.Path.RealPath [__ File__]], thứ hai, chúng tôi sẽ nhận thư mục cha mẹ bằng cách sử dụng Os.Path.Dirname [], cuối cùng, thêm cha mẹ thư mục đến sys.path để kiểm tra, chúng tôi sẽ sử dụng phương pháp của nó.
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!']
4def function_from_nib[]:
print['I am the return value from function_from_nib!']
0 [venv] PS C:\tmp\test_imports> python .\ptdraft\simulations\life\life.py
I am the return value from function_from_nib!
9This method in geeks module.......bye0
from ptdraft.nib import function_from_nib
if __name__ == '__main__':
function_from_nib[]
8 This method in geeks module.......bye2
This method in geeks module.......bye3
from ptdraft.nib import function_from_nib
if __name__ == '__main__':
function_from_nib[]
8 This method in geeks module.......bye5
This method in geeks module.......bye6
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!']
1def function_from_nib[]:
print['I am the return value from function_from_nib!']
2Output: