Auteur Topic: [OPGELOST] Hoe installeer ik Beautifulsoup voor Python 2.7.1  (gelezen 3232 keer)

Offline ton123

  • Bedankjes
  • -Gegeven: 8
  • -Ontvangen: 2
  • Berichten: 39
[OPGELOST] Hoe installeer ik Beautifulsoup voor Python 2.7.1
« Gepost op: 18 september 2012, 18:35:16 »
Misschien heeft iemand ervaring met de installatie van Beautifulsoup in combinatie met Python 2.7.1.
Ik zou graag willen weten - in jip en janneke taal - hoe dat te installeren.

Het is nodig voor de goede werking van een module in mijn OpenERP toepassing.

Zie hiervoor de parameters: http://www.synology-forum.nl/viewtopic.php?f=134&t=9975
En: http://forum.synology.com/enu/viewtopic.php?f=184&t=56373

Ik heb op dit forum één ander post gezien over beautiful soup, een hele goede post. Maar wel een oude, voor mij behoorlijk ingewikkeld en met Python 2.6.
Zie hier: http://forum.synology.com/enu/viewtopic.php?f=37&t=31459&p=124548&hilit=Beautifulsoup#msg124548
Ik ben een beetje bang dat ik all the way een ipkg installatie moet gaan en heb een steuntje nodig of er kans is dat dit ook gaat werken. Als er ergens een beatifulsoup.spk is zou dat mijn leven wat simpeler maken ....

Offline ton123

  • Bedankjes
  • -Gegeven: 8
  • -Ontvangen: 2
  • Berichten: 39
Re: Hoe installeer ik Beautifulsoup voor Python 2.7.1
« Reactie #1 Gepost op: 19 september 2012, 23:10:37 »
Bij nader inzien denk ik dat ik ipkg niet nodig heb.
En wel omdat ik denk dat BeautifulSoup een HTML/XML parser is die alleen maar in de juiste directory moet worden geplaatst.
De vraag is of dat juist is. --> Blijkt juist te zijn!
Ook is de vraag welke versie ik het beste kan gebruiken. 3.2.1 de laatste stabiele versie uit de 3 serie of de nieuwe 4.1.3?

Allerlei documentatie staat op: http://pypi.python.org/pypi/BeautifulSoup/3.2.1
en http://www.crummy.com/software/BeautifulSoup/

Ik kies voorlopig voor 3.2.1.

Mijn public windows drive is: ALLEN
Na login met putty met mijn admin account voor de synology ga ik naar deze directory:
cd /volume1/ALLEN
wget http://www.crummy.com/software/Beautifu ... 2.1.tar.gz

En de tar staat keurig op mijn ALLEN drive.
BeautifulSoup-3.2.1.tar

extract:
tar -xvf BeautifulSoup-3.2.1.tar

Je kunt desgewenst de de tar file verwijderen omdat die niet meer nodig is.
rm BeautifulSoup-3.2.1.tar

En nu kopieren naar de juiste directory, de vraag is naar welke. Ik gok dat alle libraries onder python2.7 staan.
Ik ga daar naartoe:
cd /volume1/@appstore/Python/usr/lib/python2.7
Ik krijg met ls -al:
-rw-r--r--    1 root     root          6412 Jul 30 13:02 dis.pyc
drwxr-xr-x    4 root     root          4096 Jul 30 13:02 distutils
-rw-r--r--    1 root     root        102247 May  3 07:11 doctest.py
-rw-r--r--    1 root     root          8820 May  3 07:11 dumbdbm.py
-rw-r--r--    1 root     root          4418 May  3 07:11 dummy_thread.py
-rw-r--r--    1 root     root          2804 May  3 07:11 dummy_threading.py
drwxr-xr-x    4 root     root          4096 Sep 17 20:30 email
drwxr-xr-x    2 root     root          4096 Aug  3 09:01 encodings
-rw-r--r--    1 root     root          9503 May  3 07:11 filecmp.py
-rw-r--r--    1 root     root         14143 May  3 07:11 fileinput.py
-rw-r--r--    1 root     root          3239 May  3 07:11 fnmatch.py
-rw-r--r--    1 root     root          3672 Jul 30 13:02 fnmatch.pyc
-rw-r--r--    1 root     root         14911 May  3 07:11 formatter.py
-rw-r--r--    1 root     root          4699 May  3 07:11 fpformat.py
-rw-r--r--    1 root     root         22390 May  3 07:11 fractions.py
-rw-r--r--    1 root     root         35728 May  3 07:11 ftplib.py
-rw-r--r--    1 root     root          4478 May  3 07:11 functools.py
-rw-r--r--    1 root     root          6687 Jul 30 13:02 functools.pyc
-rw-r--r--    1 root     root          3015 May  3 07:11 genericpath.py
-rw-r--r--    1 root     root          3493 Jul 30 13:02 genericpath.pyc
-rw-r--r--    1 root     root          7318 May  3 07:11 getopt.py
-rw-r--r--    1 root     root          6884 Jul 30 13:02 getopt.pyc
-rw-r--r--    1 root     root          5563 May  3 07:11 getpass.py
-rw-r--r--    1 root     root          4904 Jul 30 13:02 getpass.pyc
-rw-r--r--    1 root     root         19859 May  3 07:11 gettext.py
-rw-r--r--    1 root     root         16524 Jul 30 13:02 gettext.pyc
-rw-r--r--    1 root     root          2249 May  3 07:11 glob.py
-rw-r--r--    1 root     root          2539 Jul 30 13:02 glob.pyc
-rw-r--r--    1 root     root         18226 May  3 07:11 gzip.py
-rw-r--r--    1 root     root         15648 Jul 30 13:02 gzip.pyc
-rw-r--r--    1 root     root          5013 May  3 07:11 hashlib.py
-rw-r--r--    1 root     root          4523 Jul 30 13:02 hashlib.pyc
-rw-r--r--    1 root     root         17331 May  3 07:11 heapq.py
-rw-r--r--    1 root     root         13711 Jul 30 13:02 heapq.pyc
-rw-r--r--    1 root     root          4531 May  3 07:11 hmac.py
-rw-r--r--    1 root     root          4692 Jul 30 13:02 hmac.pyc
drwxr-xr-x    2 root     root          4096 Jul 30 12:58 hotshot
-rw-r--r--    1 root     root         18054 May  3 07:11 htmlentitydefs.py
-rw-r--r--    1 root     root          6390 Jul 30 13:02 htmlentitydefs.pyc
-rw-r--r--    1 root     root         12869 May  3 07:11 htmllib.py
-rw-r--r--    1 root     root         48093 May  3 07:11 httplib.py
-rw-r--r--    1 root     root         38562 Jul 30 13:02 httplib.pyc
drwxr-xr-x    3 root     root          4096 Jul 30 12:58 idlelib
-rw-r--r--    1 root     root         18986 May  3 07:11 ihooks.py
-rw-r--r--    1 root     root         47665 May  3 07:11 imaplib.py
-rw-r--r--    1 root     root         47482 Jul 31 20:26 imaplib.pyc
-rw-r--r--    1 root     root          3544 May  3 07:11 imghdr.py
drwxr-xr-x    2 root     root          4096 Jul 30 12:58 importlib
-rw-r--r--    1 root     root         25764 May  3 07:11 imputil.py
-rw-r--r--    1 root     root         42298 May  3 07:11 inspect.py
-rw-r--r--    1 root     root         41487 Jul 30 13:02 inspect.pyc
-rw-r--r--    1 root     root          3624 May  3 07:11 io.py
-rw-r--r--    1 root     root          3593 Jul 30 13:02 io.pyc
drwxr-xr-x    3 root     root          4096 Jul 30 13:02 json
-rwxr-xr-x    1 root     root          1994 May  3 07:11 keyword.py
-rw-r--r--    1 root     root          2149 Jul 30 13:02 keyword.pyc
drwxr-xr-x    2 root     root          4096 Jul 30 12:58 lib-dynload
drwxr-xr-x    3 root     root          4096 Jul 30 13:02 lib-tk
drwxr-xr-x    5 root     root          4096 Jul 30 12:58 lib2to3
-rw-r--r--    1 root     root          3964 May  3 07:11 linecache.py
-rw-r--r--    1 root     root          3349 Jul 30 13:02 linecache.pyc
-rw-r--r--    1 root     root         88973 May  3 07:11 locale.py
-rw-r--r--    1 root     root         49997 Jul 30 13:02 locale.pyc
drwxr-xr-x    2 root     root          4096 Jul 30 13:02 logging
-rw-r--r--    1 root     root          6252 May  3 07:11 macpath.py
-rw-r--r--    1 root     root          3275 May  3 07:11 macurl2path.py
-rw-r--r--    1 root     root         78102 May  3 07:11 mailbox.py
-rw-r--r--    1 root     root          7427 May  3 07:11 mailcap.py
-rw-r--r--    1 root     root         14350 May  3 07:11 markupbase.py
-rw-r--r--    1 root     root          9710 Jul 30 13:02 markupbase.pyc
-rw-r--r--    1 root     root           358 May  3 07:11 md5.py
-rw-r--r--    1 root     root         33434 May  3 07:11 mhlib.py
-rw-r--r--    1 root     root          7168 May  3 07:11 mimetools.py
-rw-r--r--    1 root     root          8682 Jul 30 13:02 mimetools.pyc
-rw-r--r--    1 root     root         20609 May  3 07:11 mimetypes.py
-rw-r--r--    1 root     root         18623 Jul 30 13:02 mimetypes.pyc
-rwxr-xr-x    1 root     root         15021 May  3 07:11 mimify.py
-rw-r--r--    1 root     root         24283 May  3 07:11 modulefinder.py
-rw-r--r--    1 root     root          4820 May  3 07:11 multifile.py
drwxr-xr-x    3 root     root          4096 Jul 30 12:58 multiprocessing
-rw-r--r--    1 root     root          1877 May  3 07:11 mutex.py
-rw-r--r--    1 root     root          4576 May  3 07:11 netrc.py
-rw-r--r--    1 root     root           610 May  3 07:11 new.py
-rw-r--r--    1 root     root           885 Jul 30 13:02 new.pyc
-rw-r--r--    1 root     root         21135 May  3 07:11 nntplib.py
-rw-r--r--    1 root     root         18082 May  3 07:11 ntpath.py
-rw-r--r--    1 root     root          2371 May  3 07:11 nturl2path.py
-rw-r--r--    1 root     root         10276 May  3 07:11 numbers.py
-rw-r--r--    1 root     root         15395 Jul 30 13:02 numbers.pyc
-rw-r--r--    1 root     root          5474 May  3 07:11 opcode.py
-rw-r--r--    1 root     root          6264 Jul 30 13:02 opcode.pyc
-rw-r--r--    1 root     root         61124 May  3 07:11 optparse.py
-rw-r--r--    1 root     root         57273 Jul 30 13:02 optparse.pyc
-rw-r--r--    1 root     root         26300 May  3 07:11 os.py
-rw-r--r--    1 root     root         27385 Jul 30 13:02 os.pyc
-rw-r--r--    1 root     root          4603 May  3 07:11 os2emxpath.py
-rw-r--r--    1 root     root          7913 May  3 07:11 pdb.doc
-rwxr-xr-x    1 root     root         46019 May  3 07:11 pdb.py
-rw-r--r--    1 root     root         45095 May  3 07:11 pickle.py
-rw-r--r--    1 root     root         40820 Jul 30 13:02 pickle.pyc
-rw-r--r--    1 root     root         74539 May  3 07:11 pickletools.py
-rw-r--r--    1 root     root          9647 May  3 07:11 pipes.py
-rw-r--r--    1 root     root         20013 May  3 07:11 pkgutil.py
-rw-r--r--    1 root     root         19584 Jul 30 13:02 pkgutil.pyc
drwxr-xr-x    2 root     root          4096 Jul 30 12:58 plat-linux2
-rwxr-xr-x    1 root     root         52280 May  3 07:11 platform.py
-rw-r--r--    1 root     root         37811 Jul 30 13:02 platform.pyc
-rw-r--r--    1 root     root         15176 May  3 07:11 plistlib.py
-rw-r--r--    1 root     root          8416 May  3 07:11 popen2.py
-rw-r--r--    1 root     root         12388 May  3 07:11 poplib.py
-rw-r--r--    1 root     root         13943 Jul 31 20:26 poplib.pyc
-rw-r--r--    1 root     root          8003 May  3 07:11 posixfile.py
-rw-r--r--    1 root     root         13182 May  3 07:11 posixpath.py
-rw-r--r--    1 root     root         11723 Jul 30 13:02 posixpath.pyc
-rw-r--r--    1 root     root         11932 May  3 07:11 pprint.py
-rw-r--r--    1 root     root         10669 Jul 30 13:02 pprint.pyc
-rwxr-xr-x    1 root     root         23466 May  3 07:11 profile.py
-rw-r--r--    1 root     root         27214 May  3 07:11 pstats.py
-rw-r--r--    1 root     root          4869 May  3 07:11 pty.py
-rw-r--r--    1 root     root          5930 May  3 07:11 py_compile.py
-rw-r--r--    1 root     root         13282 May  3 07:11 pyclbr.py
-rwxr-xr-x    1 root     root         92675 May  3 07:11 pydoc.py
drwxr-xr-x    2 root     root          4096 Jul 30 12:58 pydoc_data
-rwxr-xr-x    1 root     root          6969 May  3 07:11 quopri.py
-rw-r--r--    1 root     root          6825 Jul 30 13:02 quopri.pyc
-rw-r--r--    1 root     root         32237 May  3 07:11 random.py
-rw-r--r--    1 root     root         26680 Jul 30 13:02 random.pyc
-rw-r--r--    1 root     root         12984 May  3 07:11 re.py
-rw-r--r--    1 root     root         13602 Jul 30 13:02 re.pyc
-rw-r--r--    1 root     root          4296 May  3 07:11 repr.py
-rw-r--r--    1 root     root         20148 May  3 07:11 rexec.py
-rw-r--r--    1 root     root         33295 May  3 07:11 rfc822.py
-rw-r--r--    1 root     root         33171 Jul 30 13:02 rfc822.pyc
-rw-r--r--    1 root     root          5866 May  3 07:11 rlcompleter.py
-rw-r--r--    1 root     root          7202 May  3 07:11 robotparser.py
-rw-r--r--    1 root     root         10698 May  3 07:11 runpy.py
-rw-r--r--    1 root     root          5091 May  3 07:11 sched.py
-rw-r--r--    1 root     root         19050 May  3 07:11 sets.py
-rw-r--r--    1 root     root         17884 May  3 07:11 sgmllib.py
-rw-r--r--    1 root     root           393 May  3 07:11 sha.py
-rw-r--r--    1 root     root          8078 May  3 07:11 shelve.py
-rw-r--r--    1 root     root         11137 May  3 07:11 shlex.py
-rw-r--r--    1 root     root         18302 May  3 07:11 shutil.py
-rw-r--r--    1 root     root         18947 Jul 30 13:02 shutil.pyc
drwxr-xr-x   51 root     root          4096 Aug 21 16:21 site-packages
-rw-r--r--    1 root     root         20288 May  3 07:11 site.py
-rw-r--r--    1 root     root         20741 Jul 30 13:02 site.pyc
-rwxr-xr-x    1 root     root         18543 May  3 07:11 smtpd.py
-rwxr-xr-x    1 root     root         30703 May  3 07:11 smtplib.py
-rw-r--r--    1 root     root         30625 Jul 30 13:02 smtplib.pyc
-rw-r--r--    1 root     root          5973 May  3 07:11 sndhdr.py
-rw-r--r--    1 root     root         20485 May  3 07:11 socket.py
-rw-r--r--    1 root     root         16778 Jul 30 13:02 socket.pyc
drwxr-xr-x    3 root     root          4096 Jul 30 12:58 sqlite3
-rw-r--r--    1 root     root           384 May  3 07:11 sre.py
-rw-r--r--    1 root     root         16427 May  3 07:11 sre_compile.py
-rw-r--r--    1 root     root         11351 Jul 30 13:02 sre_compile.pyc
-rw-r--r--    1 root     root          7137 May  3 07:11 sre_constants.py
-rw-r--r--    1 root     root          6203 Jul 30 13:02 sre_constants.pyc
-rw-r--r--    1 root     root         26798 May  3 07:11 sre_parse.py
-rw-r--r--    1 root     root         19928 Jul 30 13:02 sre_parse.pyc
-rw-r--r--    1 root     root         15611 May  3 07:11 ssl.py
-rw-r--r--    1 root     root         15118 Jul 30 13:02 ssl.pyc
-rw-r--r--    1 root     root          1718 May  3 07:11 stat.py
-rw-r--r--    1 root     root          2933 Jul 30 13:02 stat.pyc
-rw-r--r--    1 root     root           898 May  3 07:11 statvfs.py
-rw-r--r--    1 root     root         20756 May  3 07:11 string.py
-rw-r--r--    1 root     root         21181 Jul 30 13:02 string.pyc
-rw-r--r--    1 root     root         12449 May  3 07:11 stringold.py
-rw-r--r--    1 root     root         13522 May  3 07:11 stringprep.py
-rw-r--r--    1 root     root         14947 Aug  3 09:01 stringprep.pyc
-rw-r--r--    1 root     root            82 May  3 07:11 struct.py
-rw-r--r--    1 root     root           262 Jul 30 13:02 struct.pyc
-rw-r--r--    1 root     root         54425 May  3 07:11 subprocess.py
-rw-r--r--    1 root     root         40669 Jul 30 13:02 subprocess.pyc
-rw-r--r--    1 root     root         16537 May  3 07:11 sunau.py
-rw-r--r--    1 root     root          1399 May  3 07:11 sunaudio.py
-rwxr-xr-x    1 root     root          2056 May  3 07:11 symbol.py
-rw-r--r--    1 root     root          7518 May  3 07:11 symtable.py
-rw-r--r--    1 root     root         25192 May  3 07:11 sysconfig.py
-rw-r--r--    1 root     root         17889 Jul 30 13:02 sysconfig.pyc
-rwxr-xr-x    1 root     root         11336 May  3 07:11 tabnanny.py
-rw-r--r--    1 root     root         89070 May  3 07:11 tarfile.py
-rw-r--r--    1 root     root         78964 Jul 30 13:02 tarfile.pyc
-rw-r--r--    1 root     root         21808 May  3 07:11 telnetlib.py
-rw-r--r--    1 root     root         17875 May  3 07:11 tempfile.py
-rw-r--r--    1 root     root         20878 Jul 30 13:02 tempfile.pyc
-rw-r--r--    1 root     root         16848 May  3 07:11 textwrap.py
-rw-r--r--    1 root     root         11969 Jul 30 13:02 textwrap.pyc
-rw-r--r--    1 root     root          1002 May  3 07:11 this.py
-rw-r--r--    1 root     root         32720 May  3 07:11 threading.py
-rw-r--r--    1 root     root         30704 Jul 30 13:02 threading.pyc
-rw-r--r--    1 root     root         12059 May  3 07:11 timeit.py
-rw-r--r--    1 root     root          3142 May  3 07:11 toaiff.py
-rwxr-xr-x    1 root     root          2944 May  3 07:11 token.py
-rw-r--r--    1 root     root          3931 Jul 30 13:02 token.pyc
-rw-r--r--    1 root     root         16465 May  3 07:11 tokenize.py
-rw-r--r--    1 root     root         14253 Jul 30 13:02 tokenize.pyc
-rw-r--r--    1 root     root         30152 May  3 07:11 trace.py
-rw-r--r--    1 root     root         11255 May  3 07:11 traceback.py
-rw-r--r--    1 root     root         12083 Jul 30 13:02 traceback.pyc
-rw-r--r--    1 root     root           879 May  3 07:11 tty.py
-rw-r--r--    1 root     root          2040 May  3 07:11 types.py
-rw-r--r--    1 root     root          2644 Jul 30 13:02 types.pyc
drwxr-xr-x    3 root     root          4096 Jul 30 13:02 unittest
-rw-r--r--    1 root     root         58756 May  3 07:11 urllib.py
-rw-r--r--    1 root     root         53200 Jul 30 13:02 urllib.pyc
-rw-r--r--    1 root     root         51126 May  3 07:11 urllib2.py
-rw-r--r--    1 root     root         48898 Jul 30 13:02 urllib2.pyc
-rw-r--r--    1 root     root         14379 May  3 07:11 urlparse.py
-rw-r--r--    1 root     root         14211 Jul 30 13:02 urlparse.pyc
-rw-r--r--    1 root     root          1627 May  3 07:11 user.py
-rwxr-xr-x    1 root     root          6555 May  3 07:11 uu.py
-rw-r--r--    1 root     root          4427 Jul 30 13:02 uu.pyc
-rw-r--r--    1 root     root         21095 May  3 07:11 uuid.py
-rw-r--r--    1 root     root         22082 Jul 30 13:02 uuid.pyc
-rw-r--r--    1 root     root         14044 May  3 07:11 warnings.py
-rw-r--r--    1 root     root         13645 Jul 30 13:02 warnings.pyc
-rw-r--r--    1 root     root         18099 May  3 07:11 wave.py
-rw-r--r--    1 root     root         10693 May  3 07:11 weakref.py
-rw-r--r--    1 root     root         15221 Jul 30 13:02 weakref.pyc
-rw-r--r--    1 root     root         21704 May  3 07:11 webbrowser.py
-rw-r--r--    1 root     root          3353 May  3 07:11 whichdb.py
drwxr-xr-x    2 root     root          4096 Jul 30 12:58 wsgiref
-rw-r--r--    1 root     root           187 May  3 07:11 wsgiref.egg-info
-rw-r--r--    1 root     root          5563 May  3 07:11 xdrlib.py
drwxr-xr-x    6 root     root          4096 Jul 30 13:02 xml
-rw-r--r--    1 root     root         34865 May  3 07:11 xmllib.py
-rw-r--r--    1 root     root         51242 May  3 07:11 xmlrpclib.py
-rw-r--r--    1 root     root         46572 Jul 30 13:02 xmlrpclib.pyc
-rw-r--r--    1 root     root         54020 May  3 07:11 zipfile.py
-rw-r--r--    1 root     root         39663 Jul 30 13:02 zipfile.pyc

cd /volume1/ALLEN/BeautifulSoup-3.2.1
Daar staat met ls -al:
drwxr-xr-x    2 admin    users         4096 Sep 22 13:56 .
drwxrwxrwx   27 root     root          4096 Sep 22 13:52 ..
-rw-r--r--    1 admin    users        79567 Feb 16  2012 BeautifulSoup.py
-rw-r--r--    1 admin    users        37589 Feb 16  2012 BeautifulSoupTests.py
-rw-r--r--    1 admin    users          970 Feb 16  2012 PKG-INFO
-rw-r--r--    1 admin    users         2721 Jan 14  2011 setup.py

Kopieer nu BeautifulSoup.py naar de directory Python 2.7 met:
cp BeautifulSoup.py /volume1/@appstore/Python/usr/lib/python2.7
cp: can't create '/volume1/@appstore/Python/usr/lib/python2.7/BeautifulSoup.py': Permission denied
OEPS.....

opnieuw, iets anders:
cp /volume1/ALLEN/BeautifulSoup-3.2.1/BeautifulSoup.py /volume1/@appstore/P
ython/usr/lib/python2.7/BeautifulSoup.py
Zelfde probleem....


Exit and login met Putty, maar nu als root en met het paswoord van de synology admin.
cp /volume1/ALLEN/BeautifulSoup-3.2.1/BeautifulSoup.py /volume1/@appstore/P
ython/usr/lib/python2.7/BeautifulSoup.py
Ga naar de dir:
cd /volume1/@appstore/Python/usr/lib/python2.7/
and ls
en je ziet tussen allerlei andere dingen Beautiful.py staan.

De openERP module die BeautifulSoup nodig had, blijkt nu keurig te installeren te zijn en werkt!


 

Advies aanschaf UPS voor mijn DS107+

Gestart door apekaBoard NAS hardware vragen

Reacties: 13
Gelezen: 6504
Laatste bericht 19 februari 2012, 22:46:21
door frankb
HiDrive update voor DSM 5.0

Gestart door wbreeBoard HiDrive Backup package

Reacties: 7
Gelezen: 10616
Laatste bericht 13 maart 2014, 15:49:43
door Birdy
Raspbmc nfs verbinden [opgelost]

Gestart door JuupkeBoard Synology DSM algemeen

Reacties: 4
Gelezen: 1701
Laatste bericht 14 april 2014, 22:23:17
door Juupke
Na vervanging harde schijf is toegang voor home mappen gewijzigd

Gestart door rogierpBoard File Station

Reacties: 9
Gelezen: 4339
Laatste bericht 06 juni 2014, 17:58:36
door rogierp
DS214play ondersteuning voor 64GB SDXC kaarten (UHS-I, class 10)?

Gestart door pcraenmeBoard NAS hardware vragen

Reacties: 22
Gelezen: 6978
Laatste bericht 13 augustus 2014, 10:09:42
door Tien