Xác định xem Python có chạy bên trong virtualenv không


272

Có thể xác định xem tập lệnh hiện tại có chạy trong môi trường virtualenv không?


2
Vì tò mò, tại sao bạn lại muốn biết điều đó?
Jorge Leitao

1
tức là để có thể viết tập lệnh tùy chỉnh tạo lời nhắc cho trình bao của bạn và bạn muốn lời nhắc đó cho biết bạn có ở venv hay không, vì vậy bạn muốn có thể phát hiện ra từ bên trong mã đó, tốt nhất là gọi các công cụ bên ngoài .
Marcin Orleansowski

Câu trả lời:


227

AFAIK cách đáng tin cậy nhất để kiểm tra điều này (và cách được sử dụng nội bộ trong virtualenv và trong pip) là kiểm tra sự tồn tại của sys.real_prefix:

import sys

if hasattr(sys, 'real_prefix'):
    #...

Bên trong một virtualenv, sys.prefixđiểm đến thư mục virtualenv, và sys.real_prefixđiểm đến tiếp đầu ngữ "thực" của hệ thống Python (thường /usrhay /usr/localhoặc một số như vậy).

Bên ngoài một virtualenv, sys.real_prefixkhông nên tồn tại.

Sử dụng VIRTUAL_ENVbiến môi trường là không đáng tin cậy. Nó được thiết lập bởi activatetập lệnh shell virtualenv , nhưng virtualenv có thể được sử dụng mà không cần kích hoạt bằng cách chạy trực tiếp một tệp thực thi từ thư mục bin/(hoặc Scripts) của virtualenv , trong trường hợp $VIRTUAL_ENVnày sẽ không được đặt.


11
Điều này dường như không còn hợp lệ trong Python 3 nữa.
Dan P.

49
Nếu bạn đang sử dụng virtualenv (github.com/pypa/virtualenv), câu trả lời này cũng chính xác cho Python 2 hoặc Python 3. Nếu bạn đang sử dụng pyvenv ( legacy.python.org/dev/peps/pep-0405 ), một virtualenv tương đương được xây dựng trong Python 3.3+ (nhưng không giống với virtualenv), sau đó nó sử dụng sys.base_prefix thay vì sys.real_prefix và sys.base_prefix luôn tồn tại; bên ngoài một pyvenv nó bằng sys.prefix.
Carl Meyer

2
@Kounavi Tôi không nghĩ rằng có khả năng phiên bản Windows sẽ có bất kỳ tác động nào. Câu trả lời này là một phần cốt lõi của cách virtualenv hoạt động trên bất kỳ nền tảng nào. Có thể bạn đang sử dụng Python 3 pyvenv, không phải virtualenv, trên máy Windows 2012? Hoặc có điều gì đó đang xảy ra với PATH và trên thực tế bạn không chạy trong virtualenv khi bạn nghĩ bạn là ai?
Carl Meyer

3
Một lớp lót cho các tập lệnh bashPYTHON_ENV=$(python -c "import sys; sys.stdout.write('1') if hasattr(sys, 'real_prefix') else sys.stdout.write('0')")
Sam Myers

2
Câu trả lời này đã lỗi thời, không có gì đáng ngạc nhiên. Cụ thể, câu trả lời này trả về phủ định sai cho các trường hợp sử dụng phổ biến. Điều đó thật xấu. Thay vào đó, hãy xem một trong hai: cập nhật có thẩm quyền của hroncok phát hiện chính xác tất cả các venvs không phải của Anaconda hoặc câu trả lời có thẩm quyền của Victoria Stuart phát hiện chính xác tất cả các venv Anaconda . ( Tất cả các khuyến khích của tôi cho bất cứ ai kết hợp hai câu trả lời đó. )
Cecil Curry

97

Hãy thử sử dụng pip -V(thông báo vốn V)

Nếu bạn đang chạy env ảo. nó sẽ hiển thị đường dẫn đến vị trí của env.


Nếu bạn đã di chuyển virtualenvxung quanh rất nhiều, điều đó có thể thất bại hoặc nói dối bạn. Nếu đó là nói dối, bạn có thể làm find /path/to/venv/ -type f -exec sed -ie "s:/old/path/to/venv:/path/to/venv:g" {} \+. Nếu nó không thành công (tôi có "dữ liệu thống kê xấu"), bạn sẽ cần xóa các tệp .pyc bằng find /path/to/venv -type f -name "*.pyc" -exec rm {} \+(đừng lo lắng, chúng sẽ tự động xây dựng lại).
jeremysprofile

Tôi vừa thử nghiệm điều này trên Windows 10 với Python 3.7. Nó in vị trí của pip từ cài đặt mặc định ...\lib\site-packagestrong %PATH%. Vì vậy, nó sẽ trả lại một dương tính giả trong trường hợp đó.
JamesThomasMoon1979

71

Đây là một cải tiến của câu trả lời được chấp nhận bởi Carl Meyer . Nó hoạt động với virtualenv cho Python 3 và 2 và cả cho mô-đun venv trong Python 3:

import sys


def is_venv():
    return (hasattr(sys, 'real_prefix') or
            (hasattr(sys, 'base_prefix') and sys.base_prefix != sys.prefix))

Việc kiểm tra sys.real_prefixbao gồm virtualenv, sự bình đẳng của không trống sys.base_prefixvới sys.prefixbìa venv.

Hãy xem xét một tập lệnh sử dụng chức năng như thế này:

if is_venv():
    print('inside virtualenv or venv')
else:
    print('outside virtualenv or venv')

Và lời mời sau:

$ python2 test.py 
outside virtualenv or venv

$ python3 test.py 
outside virtualenv or venv

$ python2 -m virtualenv virtualenv2
...
$ . virtualenv2/bin/activate
(virtualenv2) $ python test.py 
inside virtualenv or venv
(virtualenv2) $ deactivate

$ python3 -m virtualenv virtualenv3
...
$ . virtualenv3/bin/activate
(virtualenv3) $ python test.py 
inside virtualenv or venv
(virtualenv3) $ deactivate 

$ python3 -m venv venv3
$ . venv3/bin/activate
(venv3) $ python test.py 
inside virtualenv or venv
(venv3) $ deactivate 

4
Do Python 3.3 không còn được duy trì hoặc hỗ trợ bởi hầu hết các khung và ứng dụng Python 3, nên giờ đây hàm này giảm xuống chỉ còn một lớp lót : def is_venv(): return hasattr(sys, 'real_prefix') or sys.base_prefix != sys.prefix. Chỉ cần nói.
Cecil Curry

Đáng buồn thay, điều này dường như không hoạt động với pipenvmôi trường ảo được tạo.
dragon788

46

Kiểm tra $VIRTUAL_ENVbiến môi trường.

Biến $VIRTUAL_ENVmôi trường chứa thư mục của môi trường ảo khi ở trong môi trường ảo hoạt động.

>>> import os
>>> os.environ['VIRTUAL_ENV']
'/some/path/project/venv'

Khi bạn chạy deactivate/ rời khỏi môi trường ảo, $VIRTUAL_ENVbiến sẽ bị xóa / trống. Python sẽ tăng a KeyErrorvì biến môi trường không được đặt.

>>> import os
>>> os.environ['VIRTUAL_ENV']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/os.py", line 678, in __getitem__
    raise KeyError(key) from None
KeyError: 'VIRTUAL_ENV'

Các kiểm tra biến môi trường tương tự này tất nhiên cũng có thể được thực hiện bên ngoài tập lệnh Python, trong trình bao.


1
Điều này hoạt động cả cho virtualenvvirtualenv và venvvirtualenv.
florisla

@verboze: như là nó phải làm, phải không? Virtualenv bị vô hiệu hóa có nghĩa là tập lệnh người dùng không chạy trên một.
MestreLion

Điều này kiểm tra xem virtualenv có được kích hoạt hay không, nhưng điều đó không nhất thiết có nghĩa là quá trình Python đang chạy là từ virtualenv đó.
erb

20

Theo virtualenv pep tại http://www.python.org/dev/peps/pep-0405/#specification bạn chỉ có thể sử dụng sys.prefix thay vì os.envir ['VIRTUAL_ENV'].

sys.real_prefix không tồn tại trong virtualenv của tôi và tương tự với sys.base_prefix.


8
virtualenv là dự án độc lập hoạt động trên mọi phiên bản Python ( github.com/pypa/virtualenv ). PEP mà bạn liên kết đến là dành cho pyvenv, dựa trên virtualenv nhưng được triển khai khác (tốt hơn) và được tích hợp sẵn trong Python 3.3+. Câu hỏi này là về virtualenv, không phải pyvenv. Bạn đã đúng rằng trong một pyvenv không có sys.real_prefix.
Carl Meyer

5
Một cách hay để phát hiện từ bash bằng cách sử dụng câu trả lời này là chạy: env |grep VIRTUAL_ENV |wc -l nó sẽ trả về 1 nếu trong venv hoặc 0 nếu không.
LISTERINE 04/11/2016

3
Nếu bạn đang ở trong vỏ, bạn chỉ cần sử dụng [[ -n $VIRTUAL_ENV ]] && echo virtualenvhoặc [[ -z $VIRTUAL_ENV ]] && echo not virtualenvtùy theo nhu cầu của bạn.
Sáu

9

Để kiểm tra xem Virtualenv bên trong của bạn:

import os

if os.getenv('VIRTUAL_ENV'):
    print('Using Virtualenv')
else:
    print('Not using Virtualenv')

Bạn cũng có thể nhận được nhiều dữ liệu hơn về môi trường của mình:

import sys
import os

print(f'Python Executable: {sys.executable}')
print(f'Python Version: {sys.version}')
print(f'Virtualenv: {os.getenv("VIRTUAL_ENV")}')

1
Đây là cách tiếp cận đa nền tảng (Windows / Unix) tốt nhất.
Adi Unnithan

Cho đến nay, đây chỉ là cách đa nền tảng, cách tương thích python 2 và python 3. Cảm ơn.
RJ

8

Bạn có thể làm which pythonvà xem nếu nó trỏ đến một trong env ảo.


1
whichkhông có sẵn theo mặc định trên Windows. Bạn có thể sử dụng wherethay thế trên Windows hoặc sử dụng whichcraft . Hoặc nhìn vào sys.executable. Nhưng vẫn có những phương pháp tốt hơn.
florisla

8

Có nhiều câu trả lời tốt ở đây, và một số câu trả lời ít mạnh mẽ hơn. Đây là một cái nhìn tổng quan.

Làm thế nào để không làm điều đó

Không dựa vào vị trí của Python hoặc site-packagesthư mục.

Nếu các vị trí này được đặt thành các vị trí không chuẩn, điều đó không có nghĩa là bạn thực sự ở trong một môi trường ảo. Người dùng có thể cài đặt nhiều hơn một phiên bản Python và những phiên bản đó không phải lúc nào cũng như bạn mong đợi.

Tránh nhìn vào:

  • sys.executable
  • sys.prefix
  • pip -V
  • which python

Ngoài ra, không kiểm tra sự hiện diện của venv, .venvhoặc envstrong bất kỳ đường dẫn nào trong số này. Điều này sẽ phá vỡ cho các môi trường với một vị trí độc đáo hơn. Ví dụ, Pipenv sử dụng các giá trị băm làm tên cho các môi trường của nó.

VIRTUAL_ENV biến môi trường

Cả hai virtualenvvenvđặt biến môi trường $VIRTUAL_ENVkhi kích hoạt một môi trường. Xem PEP 405 .

Bạn có thể đọc biến này trong các tập lệnh shell hoặc sử dụng mã Python này để xác định xem nó có được đặt không.

import os
running_in_virtualenv = "VIRTUAL_ENV" in os.environ

# alternative ways to write this, also supporting the case where
# the variable is set but contains an empty string to indicate
# 'not in a virtual environment':
running_in_virtualenv = bool(os.environ.get("VIRTUAL_ENV"))
running_in_virtualenv = bool(os.getenv("VIRTUAL_ENV"))

Vấn đề là, điều này chỉ hoạt động khi môi trường được kích hoạt bởi activatetập lệnh shell.

Bạn có thể bắt đầu các tập lệnh của môi trường mà không kích hoạt môi trường , vì vậy nếu đó là vấn đề đáng lo ngại, bạn phải sử dụng một phương pháp khác.

sys.base_prefix

virtualenv, venvpyvenvđiểm sys.prefixđến Python được cài đặt bên trong virtualenv như bạn mong đợi.

Đồng thời, giá trị ban đầu của sys.prefixcũng được cung cấp dưới dạng sys.base_prefix.

Chúng ta có thể sử dụng điều đó để phát hiện nếu chúng ta đang ở trong một virtualenv.

import sys
# note: Python versions before 3.3 don't have sys.base_prefix
# if you're not in virtual environment
running_in_virtualenv = sys.prefix != sys.base_prefix

Dự phòng: sys.real_prefix

Bây giờ hãy coi chừng, virtualenvtrước khi phiên bản 20 không được thiết lập sys.base_prefixsys.real_prefixthay vào đó nó được đặt .

Vì vậy, để an toàn, hãy kiểm tra cả hai như được đề xuất trong câu trả lời của hroncok :

import sys

real_prefix = getattr(sys, "real_prefix", None)
base_prefix = getattr(sys, "base_prefix", sys.prefix)

running_in_virtualenv = (base_prefix or real_prefix) != sys.prefix

Anaconda

Nếu bạn đang sử dụng môi trường ảo Anaconda, hãy kiểm tra câu trả lời của Victoria Stuart .


OP đang hỏi "Làm thế nào để tôi?", Chứ không phải "Làm thế nào KHÔNG?" Câu trả lời này là quá mức cần thiết. Nó vượt xa tinh thần của câu hỏi và làm xáo trộn câu trả lời với quá nhiều biến thể. Hãy giữ câu trả lời của bạn đơn giản nhất có thể và trả lời câu hỏi trực tiếp.
Tiến sĩ Rich Lysakowski

Tôi đang tóm tắt nhiều câu trả lời ở đây, và đưa ra lời khuyên về câu trả lời nào có thể phù hợp với hoàn cảnh cụ thể. Câu hỏi ban đầu không cung cấp đủ ngữ cảnh để chọn một trong những kỹ thuật này là 'tốt nhất' - nó không đơn giản như vậy.
florisla

1
Trong phần dành cho sys.base_prefix, không nên thử nghiệm là:running_in_virtualenv = sys.*base_*prefix != sys.prefix
usonianhoriz

@usonianhoriz Đúng, cảm ơn!
florisla

Cảm ơn bạn, @florisia! Tôi đang trong quá trình chuyển đổi từ virtualenvwrapper sang venv tích hợp để triển khai ứng dụng và lời giải thích của bạn đã cho tôi mẫu về cách thực hiện. Tôi đã chỉ dựa vào if hasattr(sys, 'real_prefix'):bài kiểm tra, mà không còn làm việc nữa.
usonianhoriz

5
  • Cập nhật tháng 11 năm 2019 (nối thêm).

Tôi thường xuyên sử dụng một số môi trường ảo được cài đặt Anaconda (venv). Đoạn mã / ví dụ này cho phép bạn xác định xem bạn có đang ở trong một venv (hoặc môi trường hệ thống của bạn) hay không và cũng yêu cầu một venv cụ thể cho tập lệnh của bạn.

Thêm vào tập lệnh Python (đoạn mã):

# ----------------------------------------------------------------------------
# Want script to run in Python 3.5 (has required installed OpenCV, imutils, ... packages):
import os

# First, see if we are in a conda venv { py27: Python 2.7 | py35: Python 3.5 | tf: TensorFlow | thee : Theano }
try:
   os.environ["CONDA_DEFAULT_ENV"]
except KeyError:
   print("\tPlease set the py35 { p3 | Python 3.5 } environment!\n")
   exit()

# If we are in a conda venv, require the p3 venv:
if os.environ['CONDA_DEFAULT_ENV'] != "py35":
    print("\tPlease set the py35 { p3 | Python 3.5 } environment!\n")
    exit()

# See also:
# Python: Determine if running inside virtualenv
# http://stackoverflow.com/questions/1871549/python-determine-if-running-inside-virtualenv  
# [ ... SNIP! ... ]

Thí dụ:

$ p2
  [Anaconda Python 2.7 venv (source activate py27)]

(py27) $ python  webcam_.py
    Please set the py35 { p3 | Python 3.5 } environment!

(py27) $ p3
  [Anaconda Python 3.5 venv (source activate py35)]

(py35) $ python  webcam.py -n50

    current env: py35
    processing (live): found 2 faces and 4 eyes in this frame
    threaded OpenCV implementation
    num_frames: 50
    webcam -- approx. FPS: 18.59
    Found 2 faces and 4 eyes!
(py35) $

Cập nhật 1 - sử dụng trong tập lệnh bash:

Bạn cũng có thể sử dụng phương pháp này trong các tập lệnh bash (ví dụ: các tập lệnh phải chạy trong một môi trường ảo cụ thể). Ví dụ (được thêm vào tập lệnh bash):

if [ $CONDA_DEFAULT_ENV ]        ## << note the spaces (important in BASH)!
    then
        printf 'venv: operating in tf-env, proceed ...'
    else
        printf 'Note: must run this script in tf-env venv'
        exit
fi

Cập nhật 2 [tháng 11 năm 2019]

Vì bài viết gốc của tôi, tôi đã chuyển từ Anaconda venv (và chính Python đã phát triển môi trường ảo viz-a-viz ).

Xem xét lại vấn đề này, đây là một số mã Python được cập nhật mà bạn có thể chèn để kiểm tra xem bạn có đang hoạt động trong một môi trường ảo Python cụ thể (venv) không.

import os, re
try:
    if re.search('py37', os.environ['VIRTUAL_ENV']):
        pass
except KeyError:
    print("\n\tPlease set the Python3 venv [alias: p3]!\n")
    exit()

Đây là một số mã giải thích.

[victoria@victoria ~]$ date; python --version
  Thu 14 Nov 2019 11:27:02 AM PST
  Python 3.8.0

[victoria@victoria ~]$ python
  Python 3.8.0 (default, Oct 23 2019, 18:51:26) 
  [GCC 9.2.0] on linux
  Type "help", "copyright", "credits" or "license" for more information.

>>> import os, re

>>> re.search('py37', os.environ['VIRTUAL_ENV'])
<re.Match object; span=(20, 24), match='py37'>

>>> try:
...     if re.search('py37', os.environ['VIRTUAL_ENV']):
...       print('\n\tOperating in Python3 venv, please proceed!  :-)')
... except KeyError:
...     print("\n\tPlease set the Python3 venv [alias: p3]!\n")
... 

    Please set the Python3 venv [alias: p3]!

>>> [Ctrl-d]
  now exiting EditableBufferInteractiveConsole...

[victoria@victoria ~]$ p3
  [Python 3.7 venv (source activate py37)]

(py37) [victoria@victoria ~]$ python --version
  Python 3.8.0

(py37) [victoria@victoria ~]$ env | grep -i virtual
  VIRTUAL_ENV=/home/victoria/venv/py37

(py37) [victoria@victoria ~]$ python
  Python 3.8.0 (default, Oct 23 2019, 18:51:26) 
  [GCC 9.2.0] on linux
  Type "help", "copyright", "credits" or "license" for more information.

>>> import os, re
>>> try:
...     if re.search('py37', os.environ['VIRTUAL_ENV']):
...       print('\n\tOperating in Python3 venv, please proceed!  :-)')
... except KeyError:
...     print("\n\tPlease set the Python3 venv [alias: p3]!\n")
... 

    Operating in Python3 venv, please proceed!  :-)
>>> 

3

Cách dễ nhất là chỉ chạy : which python, nếu bạn đang ở trong một virtualenv, nó sẽ trỏ đến con trăn của nó thay vì toàn cầu


1
Tôi không nghĩ rằng điều này thực sự trả lời câu hỏi (quan tâm đến "kịch bản hiện tại"). Tuy nhiên, điều này trả lời câu hỏi cụ thể của tôi, "làm thế nào để tôi biết nếu tôi ở trong một môi trường ảo từ dòng lệnh."
ukrutt

1

(chỉnh sửa) Tôi tìm thấy theo cách đó, bạn nghĩ gì về nó? (nó cũng trả về đường dẫn cơ sở venv và hoạt động ngay cả đối với readthedocs nơi kiểm tra biến env không):

import os
import sys
from distutils.sysconfig import get_config_vars


def get_venv_basedir():
    """Returns the base directory of the virtualenv, useful to read configuration and plugins"""

    exec_prefix = get_config_vars()['exec_prefix']

    if hasattr(sys, 'real_prefix') is False or exec_prefix.startswith(sys.real_prefix):
        raise EnvironmentError('You must be in a virtual environment')

    return os.path.abspath(get_config_vars()['exec_prefix'] + '/../')

0

Có rất nhiều phương pháp tuyệt vời được đăng ở đây, nhưng chỉ cần thêm một phương pháp nữa:

import site
site.getsitepackages()

cho bạn biết nơi pipcài đặt các gói.


Điều này không cho biết Python có chạy trong môi trường ảo hay không.
florisla

@florisla Bạn có thể giải thích? Nếu site.getsitepackages()xuất ra một thư mục không phải là hệ thống, thì bạn có thể suy luận bạn đang ở trong một môi trường ảo.
Flow2k

Bạn có thể cài đặt Python ở nhiều vị trí. Ví dụ: trên Windows, bạn có thể cài đặt Python 'hệ thống' và phân phối WinPython cộng với Python dựa trên Conda. Tất cả đều có các thư mục gói trang web khác nhau nhưng không nhất thiết phải được tạo bởi (hoặc được sử dụng trong) a virtualenv.
florisla

@florisla Điểm hay - Tôi chỉ thấy điều này (venv hay không) là những gì câu hỏi đang hỏi (tôi đã viết một câu trả lời tương tự cho một câu hỏi khác). Tôi đồng ý rằng điều này có thể không đưa ra câu trả lời chắc chắn về việc bạn có ở venv hay không, nhưng có thể giúp bạn biết Python nào hoặc venvbạn đang sử dụng.
Flow2k

-1

Nó không chống đạn nhưng đối với môi trường UNIX, thử nghiệm đơn giản như

if run("which python3").find("venv") == -1:
    # something when not executed from venv

làm việc tuyệt vời cho tôi Sau đó, đơn giản hơn là kiểm tra một số thuộc tính và dù sao, bạn nên đặt tên cho thư mục venv của mình venv.


-1

Trong hệ điều hành windows, bạn sẽ thấy một cái gì đó như thế này:

C:\Users\yourusername\virtualEnvName\Scripts>activate
(virtualEnvName) C:\Users\yourusername\virtualEnvName\Scripts>

Dấu ngoặc có nghĩa là bạn thực sự đang ở trong môi trường ảo được gọi là "virtualEnvName".


Bạn và tôi có thể đọc 'virtualEnvName' tốt. Nhưng câu hỏi là, làm thế nào một mô-đun Python có thể đọc được điều này.
florisla

-1

Một giải pháp tiềm năng là:

os.access(sys.executable, os.W_OK)

Trong trường hợp của tôi, tôi thực sự chỉ muốn phát hiện nếu tôi có thể cài đặt các mục với pip. Mặc dù nó có thể không phải là giải pháp phù hợp cho mọi trường hợp, hãy xem xét đơn giản là kiểm tra xem bạn có quyền ghi đối với vị trí của tệp thực thi Python hay không.

Lưu ý: điều này hoạt động trong tất cả các phiên bản của Python, nhưng cũng trả về Truenếu bạn chạy hệ thống Python với sudo. Đây là trường hợp sử dụng tiềm năng:

import os, sys
can_install_pip_packages = os.access(sys.executable, os.W_OK)

if can_install_pip_packages:
    import pip
    pip.main(['install', 'mypackage'])

-1

Đây là một câu hỏi cũ, nhưng quá nhiều ví dụ ở trên quá phức tạp.

Giữ cho nó đơn giản: (trong Jupyter Notebook hoặc thiết bị đầu cuối Python 3.7.1 trên Windows 10)


import sys
print(sys.executable)```

# example output: >> `C:\Anaconda3\envs\quantecon\python.exe`

OR 
```sys.base_prefix```

# Example output: >> 'C:\\Anaconda3\\envs\\quantecon'

Nếu bạn thêm logic để kiểm tra sự hiện diện của envsđường dẫn đó, điều này sẽ ngừng hoạt động khi bạn chuyển từ anaconda sang virtualenvhoặc pipenv.
florisla

Florisla, bạn đã cung cấp câu trả lời của mình "Làm thế nào để không làm điều đó" gần 3 tháng sau khi tôi cung cấp câu trả lời phù hợp với tôi trong giới hạn (tôi không di chuyển giữa virtualenv và pipenv). Đó là một môn thể thao tồi để hạ thấp câu trả lời của người khác để làm cho cái nhìn của bạn tốt hơn.
Tiến sĩ Rich Lysakowski

Giàu có, những gì làm việc cho bạn có thể không làm việc cho người khác. Nó thậm chí có thể không hoạt động cho các poster ban đầu.
florisla
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.