forked from yazbel/python
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpaketler.html
More file actions
962 lines (916 loc) · 69.7 KB
/
paketler.html
File metadata and controls
962 lines (916 loc) · 69.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
<!DOCTYPE html>
<html lang="tr">
<html lang="tr">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta content="Bu bölümde paketler konusunu inceleyeceğiz." name="description" />
<meta content="python, paket, import, __init__.py, init, Android, iOS, kivy, django, üçüncü şahıs paketleri, standart paketler, bağıl içe aktarma, relative import" name="keywords" />
<title>Paketler — Python 3 için Türkçe Kılavuz</title>
<link rel="stylesheet" href="_static/pyramid.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/doctools.js"></script>
<script src="_static/language_data.js"></script>
<script src="_static/translations.js"></script>
<link rel="search" title="Ara" href="search.html" />
<link rel="next" title="Önemli Standart Kütüphane Modülleri" href="standart_moduller/index.html" />
<link rel="prev" title="Nesne Tabanlı Programlama (Devamı)" href="nesne_tabanli_programlama7.html" />
<!--[if lte IE 6]>
<link rel="stylesheet" href="_static/ie6.css" type="text/css" media="screen" charset="utf-8" />
<![endif]-->
</head><body>
<div class='header'><a href='https://yazbel.com'>yazbel.com</a></div>
<ul class='navbar'>
<li><a href="#"><del>pdf desteği sonlanmıştır</del></a></li>
<li class="forum"><a href="http://forum.yazbel.com">forum</a></li>
</ul>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Gezinti</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="standart_moduller/index.html" title="Önemli Standart Kütüphane Modülleri"
accesskey="N">sonraki</a></li>
<li class="right" >
<a href="nesne_tabanli_programlama7.html" title="Nesne Tabanlı Programlama (Devamı)"
accesskey="P">önceki</a> |</li>
<li class="nav-item nav-item-0"><a href=".">⌂</a></li>
<li class="nav-item nav-item-this"><a href="">Paketler</a></li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="body" role="main">
<div class="section" id="paketler">
<h1>Paketler<a class="headerlink" href="#paketler" title="Bu başlık için kalıcı bağlantı">¶</a></h1>
<div class="admonition warning">
<p class="admonition-title">Uyarı</p>
<p>Bu makale yoğun bir şekilde geliştirilmekte, içeriği sık sık
güncellenmektedir.</p>
</div>
<p>Birkaç bölüm önce, Python’ın belkemiği olduğunu söylediğimiz modüller konusundan
söz etmiştik. Bu bölümde de yine modüllerle bağlantılı bir konuyu ele alacağız.
Konumuz Python’daki paketler.</p>
<div class="section" id="paket-nedir">
<h2>Paket Nedir?<a class="headerlink" href="#paket-nedir" title="Bu başlık için kalıcı bağlantı">¶</a></h2>
<p>Öncelikle paketin ne demek olduğunu anlamaya çalışarak başlayalım. Python’da bir
dizin yapısı içinde bir araya getirilen, birbiriyle bağlantılı modüllere paket
adı verilir. Dolayısıyla paketler modüllerden oluşur.</p>
<p>Python programlama dilinde paketler hem geniş bir yer tutar, hem de büyük bir
önem taşır. Hatta Python’ı bilmenin paketleri bilmek demek olduğunu söylersek
çok da abartmış olmayız. Mesela Python’la web programları yazmak için kullanılan
en gözde araçlardan biri olan <cite>django</cite> web çatısı, aslında birtakım üçüncü şahıs
modüllerinin bir paket yapısı içinde bir araya getirilmiş halinden başka bir şey
değildir. Aynı şekilde Python’la Android ve iOS üzerinde çalışabilecek
programlar yazmak isterseniz <cite>kivy</cite> adlı bir başka Python paketini öğrenmeniz
gerekir. Python programlama dilini kullanarak grafik arayüzlü yazılımlar
geliştirmemizi sağlayan <cite>tkinter</cite> ise standart kütüphanede bulunan pek çok
paketten yalnızca bir tanesidir.</p>
<p>Etrafta <cite>django</cite>, <cite>kivy</cite> ve <cite>tkinter</cite> gibi pek çok kullanışlı paket
bulabilirsiniz. Mesela standart kütüphanede bulunan <cite>sqlite3</cite>, Sqlite
veritabanları üzerinde çalışmamıza imkan tanıyan çeşitli modülleri içinde
barındıran bir Python paketidir. Yine standart kütüphanede bulunan <cite>urllib</cite>
paketi yardımıyla internet adresleri (URL’ler) üzerinde çeşitli işlemler
yapabilirsiniz. Python kurulum dizini içindeki <cite>Lib</cite> klasörü altında pek çok
standart Python paketi görebilirsiniz.</p>
<p>Peki modüllerle paketleri birbirinden ayıran şey nedir?</p>
<p>Öncelikle, paketler modüllere kıyasla çok daha kapsamlı bir yapıdır. Zira bir
paket içinde (genellikle) birden fazla modül bulunur. Örneğin standart
kütüphanede bulunan ve tek bir <cite>os.py</cite> dosyasından oluşan <cite>os</cite> bir modülken,
içinde pek çok farklı modülü barındıran <cite>collections</cite> bir pakettir. Tek bir
dosyadan oluştuğu ve bir dizin yapısı içinde yer almadığı için bir modülden içe
aktarma işlemi gerçekleştirmek son derece kolaydır. Paketlerden içe aktarma
yaparken uymamız gereken kurallar ise haliyle biraz daha karmaşıktır.</p>
<p>İkincisi, bütün paketler aynı zamanda birer modüldür, ancak bütün modüller birer
paket değildir. Örneğin <cite>venv</cite> paketinden bahsederken ‘<cite>venv</cite> modülü’ demek
yanlış olmaz. Ancak <cite>os</cite> modülünden bahsederken ‘<cite>os</cite> paketi’ demek biraz abes
kaçacaktır.</p>
<p>Üçüncüsü, paketlerin <cite>__path__</cite> adlı özel bir niteliği bulunur. Modüllerde ise
bu nitelik bulunmaz. Örneğin:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">os</span>
<span class="gp">>>> </span><span class="n">os</span><span class="o">.</span><span class="n">__path__</span>
<span class="go">AttributeError: 'module' object has no attribute '__path__'</span>
</pre></div>
</div>
<p><cite>os</cite> bir modül olduğu için, <code class="docutils literal notranslate"><span class="pre">__path__</span></code> niteliğine sahip değildir. Bir de
<cite>json</cite> paketine bakalım:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">json</span>
<span class="gp">>>> </span><span class="n">json</span><span class="o">.</span><span class="n">__path__</span>
</pre></div>
</div>
<p><cite>json</cite> ise bir paket olduğu için, <code class="docutils literal notranslate"><span class="pre">__path__</span></code> niteliğine sahiptir. Birazdan
bu niteliğin ne işe yaradığını anlatacağız. Ama ondan önce öğrenmeniz gereken
başka şeyler var.</p>
</div>
<div class="section" id="paket-turleri">
<h2>Paket Türleri<a class="headerlink" href="#paket-turleri" title="Bu başlık için kalıcı bağlantı">¶</a></h2>
<p>Tıpkı fonksiyonlarda ve modüllerde olduğu gibi, paketlerin de türleri vardır.
Paketleri, kaynaklarına göre ikiye ayırabiliriz:</p>
<blockquote>
<div><ul class="simple">
<li><p>Standart Paketler</p></li>
<li><p>Üçüncü Şahıs Paketleri</p></li>
</ul>
</div></blockquote>
<p>Bu türlerin ne anlama geldiğini isimlerine bakarak rahatlıkla anlayabiliyoruz.
Ama gelin isterseniz bunları kısaca gözden geçirelim.</p>
<p>Öncelikle standart paketlerden başlayalım.</p>
<div class="section" id="standart-paketler">
<h3>Standart Paketler<a class="headerlink" href="#standart-paketler" title="Bu başlık için kalıcı bağlantı">¶</a></h3>
<p>Standart paketler, Python’ın standart kütüphanesinde bulunan paketlerdir. Tıpkı
gömülü fonksiyonlar ve standart modüller gibi, standart paketler de dilin bir
parçası olduklarından, bunlara erişebilmek için herhangi bir ek yazılım indirip
kurmamıza gerek kalmaz; bu paketler her an emrimize amadedir. Standart paketlere
Python kurulum dizini içindeki <cite>Lib</cite> klasöründen erişebilirsiniz. Bir standart
paketin tam olarak hangi konumda bulunduğunu öğrenmek için ise ilgili paketin
<code class="docutils literal notranslate"><span class="pre">__path__</span></code> niteliğini sorgulayabilirsiniz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">urllib</span>
<span class="gp">>>> </span><span class="n">urllib</span><span class="o">.</span><span class="n">__path__</span>
</pre></div>
</div>
<p>Eğer sorguladığınız şeyin bir <code class="docutils literal notranslate"><span class="pre">__path__</span></code> niteliği yoksa, paket sandığınız o
şey, aslında bir paket değildir. Örneğin:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">subprocess</span>
<span class="gp">>>> </span><span class="n">subprocess</span><span class="o">.</span><span class="n">__path__</span>
<span class="gt">Traceback (most recent call last):</span>
File <span class="nb">"<stdin>"</span>, line <span class="m">1</span>, in <span class="n"><module></span>
<span class="gr">AttributeError</span>: <span class="n">'module' object has no attribute '__path__'</span>
</pre></div>
</div>
<p>Çünkü, bildiğiniz gibi, paketlerin aksine, modüllerin <code class="docutils literal notranslate"><span class="pre">__path__</span></code> adlı bir
niteliği bulunmaz. <cite>subprocess</cite> de bir paket değil, modül olduğu için
<cite>__path__</cite> sorgusu hata verecektir.</p>
<p>Bir paketin <code class="docutils literal notranslate"><span class="pre">__path__</span></code> niteliğini sorguladığınızda çıktıda hangi dizini
görüyorsanız, o paketin bilgisayardaki konumu odur. Mesela yukarıda adını
andığımız <cite>urllib</cite> paketinin <code class="docutils literal notranslate"><span class="pre">__path__</span></code> niteliğini sorgulayıp, karşımıza çıkan
klasöre gidelim. Paket dizininin içini açtığımızda karşımıza şu dosyalar
çıkacak:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="n">error</span><span class="o">.</span><span class="n">py</span>
<span class="n">parse</span><span class="o">.</span><span class="n">py</span>
<span class="n">request</span><span class="o">.</span><span class="n">py</span>
<span class="n">response</span><span class="o">.</span><span class="n">py</span>
<span class="n">robotparser</span><span class="o">.</span><span class="n">py</span>
<span class="fm">__init__</span><span class="o">.</span><span class="n">py</span>
</pre></div>
</div>
<p>Daha önce de dediğimiz gibi, paketler modüllerden oluşur. İşte <cite>urllib</cite> paketi
de yukarıda ismini gördüğümüz modüllerin birleşiminden oluşuyor. Python kurulum
dizini içindeki <cite>Lib</cite> klasörü altında yer alan paketleri inceleyerek, hangi
paketin hangi modüllerden oluştuğunu kendiniz de görebilirsiniz.</p>
</div>
<div class="section" id="ucuncu-sahis-paketleri">
<h3>Üçüncü Şahıs Paketleri<a class="headerlink" href="#ucuncu-sahis-paketleri" title="Bu başlık için kalıcı bağlantı">¶</a></h3>
<p>Python’da standart paketlerin dışında bir de üçüncü şahıs paketleri vardır.
Bunlar Python geliştiricileri haricindeki kişilerce yazılıp kullanımımıza
sunulmuş araçlardır. Bu paketler, standart paketlerin aksine dilin bir parçası
olmadığından, bu paketleri kullanabilmek için öncelikle bunları bilgisayarımıza
kurmamız gerekir. Mesela <cite>django</cite>, <cite>kivy</cite> ve ilk derslerimizden birinde
bahsettiğimiz <cite>cx_freeze</cite> birer üçüncü şahıs paketidir.</p>
<p>Peki bu üçüncü şahıs paketlerini nereden bulabiliriz?</p>
<p>Hatırlarsanız Modüller konusunu işlerken ‘Üçüncü Şahıs Modüllerinden’ de söz
etmiştik. Üçüncü şahıs modüllerini bulabileceğimiz başlıca kaynağın
<a class="reference external" href="https://pypi.org">https://pypi.org</a> adresi olduğunu ve buradan 60.000’in üzerinde
üçüncü şahıs Python modülüne ulaşabileceğimizi de ifade etmiştik. İşte orada
bahsettiğimiz üçüncü şahıs modülleri, aslında birer pakettir. Zira üçüncü şahıs
modülleri çoğunlukla birer paket biçiminde sunulur. Dolayısıyla üçüncü şahıs
modüllerine nereden ve nasıl ulaşıyorsak, üçüncü şahıs paketlerine de aynı
yerden ve aynı şekilde ulaşabiliriz. Ayrıca bir üçüncü şahıs paketini kurmadan
önce, ilgili paketin yardım dosyalarını veya websitesini incelemekte de fayda
var. Çünkü bazı üçüncü şahıs modüllerini kurabilmek için birtakım özel
gereksinimleri yerine getirmeniz gerekiyor olabilir. Bu tür bilgilere de ancak
ilgili paketi geliştiren kişi veya ekibin websitesinden ulaşabilirsiniz.</p>
<p>Bir üçüncü şahıs paketinin <a class="reference external" href="https://pypi.org">https://pypi.org</a> adresindeki adını
öğrendikten sonra, bu paketi şu komutla kurabilirsiniz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="n">pip3</span> <span class="n">install</span> <span class="n">paket_adı</span>
</pre></div>
</div>
<p>Mesela <cite>restructuredText</cite> biçimli metin dosyalarından şık ve kullanışlı
belgeler üretmemizi sağlayan <cite>sphinx</cite> paketi PyPI sitesinde bulunuyor.
Dolayısıyla bu paketi kurmak için şu komutu verebiliriz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="n">pip3</span> <span class="n">install</span> <span class="n">sphinx</span>
</pre></div>
</div>
<p>Elbette, eğer bir GNU/Linux dağıtımı kullanıyorsanız, bu komutu root haklarıyla
çalıştırmanız gerektiğini söylememe herhalde gerek yok:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="n">sudo</span> <span class="n">pip3</span> <span class="n">install</span> <span class="n">sphinx</span>
</pre></div>
</div>
<p><cite>pip3</cite> adlı yazılım, <cite>sphinx</cite> paketinin bütün dosyalarını PyPI sitesinden çekip
otomatik olarak bilgisayarımıza kuracaktır.</p>
<p>Bir üçüncü şahıs paketini <code class="docutils literal notranslate"><span class="pre">pip3</span></code> komutuyla kurmak yerine elle kurmayı da
tercih edebilirsiniz. Örnek olarak bu defa <cite>django</cite> paketini alalım. Bu paketin
en son sürümünü <a class="reference external" href="https://github.com/django/django/archive/master.tar.gz">https://github.com/django/django/archive/master.tar.gz</a>
adresinden indirebilirsiniz. Ayrıca arzu ederseniz <a class="reference external" href="https://www.djangoproject.com">https://www.djangoproject.com</a>
adresine uğrayarak bu modülün resmi websitesine de gözatabilirsiniz.</p>
<p>İndirdiğiniz <cite>tar.gz</cite> uzantılı sıkıştırılmış dosyayı açtığınızda karşısınıza pek
çok dizin ve bu dizinlerin içinde de pek çok Python dosyası çıkacak. Django,
geniş kapsamlı üçüncü şahıs paketlerine güzel bir örnektir.</p>
<p>Django paketini açıp <cite>django-master</cite> adlı dizinin içine girdiğinizde, orada
<cite>setup.py</cite> adlı bir dosya göreceksiniz. İşte <code class="docutils literal notranslate"><span class="pre">pip3</span></code> komutu yerine, bu dosyayı
kullanarak da bu paketi bilgisayarımıza kurabiliriz.</p>
<p>Dikkatlice bakın:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="n">python3</span> <span class="n">setup</span><span class="o">.</span><span class="n">py</span> <span class="n">install</span>
</pre></div>
</div>
<p>Bu komutta iki önemli unsur var. Birincisi, komutu çalıştırdığımız Python
sürümü. Unutmayın, bir Python paketini hangi Python sürümü ile kurarsanız, o
paketi o sürüm ile kullanabilirsiniz. Ben yukarıdaki komutta, sizin Python
sürümünüzü başlatan komutun <code class="docutils literal notranslate"><span class="pre">python3</span></code> olduğunu varsaydım. Eğer siz Python’ı
başlatmak için veya başka Python programlarını çalıştırmak için farklı bir komut
kullanıyorsanız, <cite>setup.py</cite> dosyasını da o komutla çalıştıracaksınız. Neticede
<cite>setup.py</cite> de sıradan bir Python programıdır. Bu programı <cite>install</cite> parametresi
ile birlikte çalıştırarak Django paketini sisteminize kurmuş oluyorsunuz.
Kurulum tamamlandıktan sonra, kurulumun başarılı olup olmadığını test etmek için
Python komut satırında şu komutu verin:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">django</span>
</pre></div>
</div>
<p>Eğer herhangi bir çıktı verilmeden alt satıra geçildiyse, bir üçüncü şahıs
paketi olan <cite>django</cite>’yu bilgisayarınıza başarıyla kurmuşsunuz demektir. Bu
üçüncü şahıs modülünü nasıl kullanacağınızı öğrenmek için internet üzerindeki
sayısız makaleden ve kitaptan yararlanabilirsiniz.</p>
</div>
</div>
<div class="section" id="paketlerin-ice-aktarilmasi">
<h2>Paketlerin İçe Aktarılması<a class="headerlink" href="#paketlerin-ice-aktarilmasi" title="Bu başlık için kalıcı bağlantı">¶</a></h2>
<p>Modüllerle paketler arasındaki önemli bir fark, paketlerin modüllere kıyasla
daha karmaşık bir yapıda olmasıdır. Yalnızca tek bir dosyadan oluşan modüllerin
bu basit yapısından ötürü, bir modülden nitelik veya metot içe aktarmak çok
kolaydır. Mesela bir modül olan <cite>os</cite>’u şu şekilde içe aktarabiliriz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">os</span>
</pre></div>
</div>
<p>Eğer <cite>os</cite> modülünden <cite>name</cite> niteliğini almak istersek şu komutu kullanabiliriz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">os</span> <span class="kn">import</span> <span class="n">name</span>
</pre></div>
</div>
<p><cite>os</cite> modülü içindeki bütün nitelik ve metotları içe aktarmak istediğimizde
yıldızlı içe aktarma yönteminden yararlanabiliriz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">os</span> <span class="kn">import</span> <span class="o">*</span>
</pre></div>
</div>
<p>Veya bu modül içindeki bir niteliği veya metodu başka bir isim altında da içe
aktarabiliriz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">os</span> <span class="kn">import</span> <span class="n">execv</span> <span class="k">as</span> <span class="n">exe</span>
</pre></div>
</div>
<p>Gelelim paketlere…</p>
<div class="section" id="import-paket">
<h3>import paket<a class="headerlink" href="#import-paket" title="Bu başlık için kalıcı bağlantı">¶</a></h3>
<p>Mesela <cite>urllib</cite> paketini ele alalım. Tıpkı <cite>os</cite> modülünde yaptığımız gibi,
<cite>urllib</cite> paketini de şu şekilde içe aktarabiliriz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">urllib</span>
</pre></div>
</div>
<p>Ancak <cite>os</cite> modülünün aksine, <cite>urllib</cite> paketini içe aktardığımızda mevcut isim
alanına herhangi bir nitelik veya metot otomatik olarak aktarılmaz. Örneğin <cite>os</cite>
modülünü içe aktardığımızda bu modülün içeriğinin, <cite>os</cite> öneki altında mevcut
isim alanına döküldüğünü biliyoruz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">dir</span><span class="p">(</span><span class="n">os</span><span class="p">)</span>
</pre></div>
</div>
<p>Gördüğünüz gibi, modül içeriği kullanılabilir durumda. Listedeki nitelik ve
metotlara <cite>os</cite> öneki ile erişebiliriz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">os</span><span class="o">.</span><span class="n">name</span>
<span class="gp">>>> </span><span class="n">os</span><span class="o">.</span><span class="n">listdir</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">getcwd</span><span class="p">())</span>
</pre></div>
</div>
<p>gibi…</p>
<p>Ancak <code class="docutils literal notranslate"><span class="pre">import</span> <span class="pre">os</span></code> komutunun aksine, <code class="docutils literal notranslate"><span class="pre">import</span> <span class="pre">urllib</span></code> komutu, paket içeriğini
otomatik olarak mevcut isim alanına aktarmaz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">urllib</span>
<span class="gp">>>> </span><span class="nb">dir</span><span class="p">(</span><span class="n">urllib</span><span class="p">)</span>
<span class="go">['__builtins__', '__cached__', '__doc__', '__file__',</span>
<span class="go"> '__loader__', '__name__', '__package__', '__path__',</span>
<span class="go"> '__spec__']</span>
</pre></div>
</div>
<p>Gördüğünüz gibi listede yalnızca standart metot ve nitelikler var. Bu listede
mesela paket içeriğinde olduğunu bildiğimiz <cite>error.py</cite>, <cite>parse.py</cite>,
<cite>request.py</cite>, <cite>response.py</cite> ve <cite>robotparser.py</cite> gibi modülleri göremiyoruz. Eğer
paket içinde bulunan belirli bir modülü içe aktarmak istiyorsak bunu açık açık
belirtmeliyiz. Nasıl mı? Görelim…</p>
</div>
<div class="section" id="import-paket-modul">
<h3>import paket.modül<a class="headerlink" href="#import-paket-modul" title="Bu başlık için kalıcı bağlantı">¶</a></h3>
<p>Mesela <cite>urllib</cite> paketinden <cite>request</cite> modülünü içe aktarmak
istersek şu komutu yazacağız:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">urllib.request</span>
</pre></div>
</div>
<p>Bu modülü yukarıdaki şekilde içe aktardığımızda, modül içindeki nitelik ve
metotlara <cite>urllib.request</cite> önekiyle erişebiliriz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">urllib</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">urlopen</span><span class="p">(</span><span class="s1">'https://yazbel.com/'</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="section" id="from-paket-import-modul">
<h3>from paket import modül<a class="headerlink" href="#from-paket-import-modul" title="Bu başlık için kalıcı bağlantı">¶</a></h3>
<p>Yukarıda olduğu gibi, <cite>urllib</cite> paketi içindeki <cite>request</cite> modülünü <code class="docutils literal notranslate"><span class="pre">import</span>
<span class="pre">paket.modül</span></code> gibi bir komutla içe aktardığımızda ilgili modülün bütün nitelik
ve metotları <cite>urllib.request</cite> ismi altında içe aktarıldığından, <cite>urllib</cite> paketi
içindeki <cite>request</cite> modülünün nitelik ve metotlarına ulaşabilmek için her
defasında <cite>urllib.request</cite> önekini kullanmamız gerekir. Eğer her defasında uzun
uzun <cite>urllib.request</cite> yazmak istemiyorsanız paket içindeki modülü şu şekilde içe
aktarabilirsiniz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">urllib</span> <span class="kn">import</span> <span class="n">request</span>
</pre></div>
</div>
<p>Böylece <cite>request</cite> modülünün nitelik ve metotlarına yalnızca <cite>request</cite> önekiyle
erişebilirsiniz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">request</span><span class="o">.</span><span class="n">urlopen</span><span class="p">(</span><span class="s1">'https://yazbel.com/'</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="section" id="from-paket-modul-import-nitelik-veya-metot">
<h3>from paket.modül import nitelik_veya_metot<a class="headerlink" href="#from-paket-modul-import-nitelik-veya-metot" title="Bu başlık için kalıcı bağlantı">¶</a></h3>
<p>Peki bir paket içinde yer alan herhangi bir modül içindeki nitelik ve metotlara
öneksiz olarak erişmek istersek ne yapacağız? Python bize bu isteğimizi yerine
getirmemizi sağlayacak bir yol da sunar.</p>
<p>Dikkatlice bakın:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">urllib.request</span> <span class="kn">import</span> <span class="n">urlopen</span>
</pre></div>
</div>
<p>Bu şekilde <cite>urllib</cite> paketi içindeki <cite>request</cite> modülünden <cite>urlopen</cite> adlı metodu
doğrudan içe aktarmış olduk. Dolayısıyla bu metodu dümdüz kullanabiliriz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">urlopen</span><span class="p">(</span><span class="s1">'https://yazbel.com/'</span><span class="p">)</span>
</pre></div>
</div>
<p>Ancak, modüller konusunu işlerken öneksiz aktarmaya ilişkin söylediklerimizin
paketler için de geçerli olduğunu aklımızdan çıkarmıyoruz.</p>
</div>
<div class="section" id="from-paket-modul-import">
<h3>from paket.modül import *<a class="headerlink" href="#from-paket-modul-import" title="Bu başlık için kalıcı bağlantı">¶</a></h3>
<p>Eğer bir paket içindeki bir modülün bütün nitelik ve metotlarını mevcut isim
alanına olduğu gibi aktarmak isterseniz şu içe aktarma yöntemini
kullanabilirsiniz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">paket.modül</span> <span class="kn">import</span> <span class="o">*</span>
</pre></div>
</div>
<p>Bu bilgiyi <cite>urllib</cite> modülüne uygulayalım:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">urllib.request</span> <span class="kn">import</span> <span class="o">*</span>
</pre></div>
</div>
<p>Bu şekilde <cite>urllib</cite> paketi içindeki <cite>request</cite> modülünün bütün nitelik ve
metotlarını doğrudan mevcut isim alanına aktarmış olduk. Bu yöntemin büyük bir
rahatlık sunmakla birlikte önemli dezavantajlara da sahip olduğunu gayet iyi
bildiğinizden eminim.</p>
</div>
</div>
<div class="section" id="kendi-olusturdugumuz-paketler">
<h2>Kendi Oluşturduğumuz Paketler<a class="headerlink" href="#kendi-olusturdugumuz-paketler" title="Bu başlık için kalıcı bağlantı">¶</a></h2>
<p>Buraya kadar hep başkalarının yazdığı, hazır paketlerden söz ettik. Bu sayede
bir Python paketinin yapı olarak neye benzediğini ve nasıl kullanılacağını
kabataslak da olsa anlamış olduk. Elbette biz sadece başkalarının yazdığı
paketleri kullanmayacağız. Bir de bizim kendi yazdığımız Python paketleri
olacak.</p>
<p>Kendi oluşturduğumuz paketler, adı üzerinde, kendi kendimize yazıp meydana
getirdiğimiz paketlerdir. Bu paketleri iyice geliştirdikten ve başkaları için de
yararlı olabilecek hale getirdikten sonra, istersek <a class="reference external" href="https://pypi.org">https://pypi.org</a>
adresindeki üçüncü şahıs paket deposuna yükleyebiliriz. Böylece kendi
geliştirdiğimiz paketler de, üçüncü şahıs Python paketleri arasına girmiş
olur…</p>
<p>İşte bu bölümde, bu tür paketleri nasıl yazacağımızı ele alacağız.</p>
<div class="section" id="paket-olusturmak">
<h3>Paket Oluşturmak<a class="headerlink" href="#paket-olusturmak" title="Bu başlık için kalıcı bağlantı">¶</a></h3>
<p>Bir Python programı yazdığınızı düşünün. Programınızı ilk yazmaya başlarken
doğal olarak programınız tek bir dosyadan oluşacaktır. Ancak elbette programınız
büyüdükçe, bütün kodları tek bir dosyaya sıkıştırmak yerine, farklı işlevleri
farklı dosyalar içinde tanımlamanın daha mantıklı olduğunu farkedeceksiniz.
Mesela programın grafik arayüz kısmını bir dosyada tanımlarken, düğmelere,
menülere bağlayacağınız işlevleri bir başka dosyada tanımlamak isteyebilirsiniz.
Programınızın gerçekleştirdiği işlemleri küçük, mantıklı birimlere bölüp bunları
farklı modüllere taşımanız, programınızı çok daha rahat bir şekilde idare
etmenizi sağlayacaktır. Yani, yazdığınız programı birkaç modüle bölüp, bunları
bir paket yapısı içinde sunmanız hem kendiniz açısından, hem de kodlarınızı
okuyan başkaları açısından işleri epey kolaylaştıracaktır.</p>
<p>Python’da bir paket oluşturmak son derece kolaydır. Program kodlarını içeren
<cite>.py</cite> dosyasını bir klasör içine koyduğunuz anda, o klasörün adını taşıyan bir
paket meydana getirmiş olursunuz.</p>
<p>Mesela bir sipariş takip programı yazdığımızı düşünelim. Ana klasörümüzün adını
<cite>siparistakip</cite> koyalım. Bu klasör içinde de <cite>komut.py</cite>, <cite>veritabani.py</cite> ve
<cite>siparis.py</cite> adlı modüller olsun. Yani şöyle bir dosya-dizin yapısı
oluşturalım:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="o">+</span> <span class="n">siparistakip</span>
<span class="o">|</span><span class="n">__</span> <span class="n">siparis</span><span class="o">.</span><span class="n">py</span>
<span class="o">|</span><span class="n">__</span> <span class="n">komut</span><span class="o">.</span><span class="n">py</span>
<span class="o">|</span><span class="n">__</span> <span class="n">veritabani</span><span class="o">.</span><span class="n">py</span>
</pre></div>
</div>
<p>İşte bu şekilde basit bir dosya-dizin yapısı oluşturduğumuzda, <cite>siparistakip</cite>
adlı bir Python paketi meydana getirmiş oluyoruz<a class="footnote-reference superscript" href="#id2" id="id1">1</a>.</p>
<p>Gelin isterseniz, <cite>siparistakip</cite> dizininin gerçekten bir paket olduğunu teyit
edelim.</p>
<p>Öncelikle paketimizi içe aktaralım. Bunun için <cite>siparistakip</cite> dizininin
bulunduğu klasörde şu komutu verelim:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">siparistakip</span>
</pre></div>
</div>
<p>Şimdi paket içeriğini kontrol edelim:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">dir</span><span class="p">(</span><span class="n">siparistakip</span><span class="p">)</span>
<span class="go">['__doc__', '__loader__', '__name__',</span>
<span class="go"> '__package__', '__path__', '__spec__']</span>
</pre></div>
</div>
<p>Gördüğünüz gibi, listede <cite>__path__</cite> adlı bir nitelik var. Bu niteliğin yalnızca
paketlerde bulunduğunu biliyorsunuz. Demek ki <cite>siparistakip</cite> gerçekten de bir
Python paketiymiş. Bunun dışında, listede gördüğünüz <cite>__package__</cite> niteliğini
kullanarak da bir modülün paket olup olmadığını kontrol edebilirsiniz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">siparistakip</span><span class="o">.</span><span class="n">__package__</span>
<span class="go">'siparistakip'</span>
</pre></div>
</div>
<p>Eğer test ettiğimiz modül bir paketse, <cite>__package__</cite> niteliği bize bir paket adı
verecektir. Yok eğer test ettiğimiz modül bir paket değil de alelade bir
modülse, <cite>__package__</cite> niteliği boş bir karakter dizisi döndürecektir. Mesela
<cite>os</cite> modülünün bir paket olmadığını biliyoruz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">os</span>
<span class="gp">>>> </span><span class="n">os</span><span class="o">.</span><span class="n">__package__</span>
<span class="go">''</span>
</pre></div>
</div>
<p>Gördüğünüz gibi, bu modülün <cite>__package__</cite> niteliği boş bir karakter dizisi.
Ayrıca bu modül bir paket olmadığı için, <cite>__path__</cite> adlı bir nitelik de
barındırmıyor:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">os</span><span class="o">.</span><span class="n">__path__</span>
<span class="gt">Traceback (most recent call last):</span>
File <span class="nb">"<stdin>"</span>, line <span class="m">1</span>, in <span class="n"><module></span>
<span class="gr">AttributeError</span>: <span class="n">'module' object has no attribute '__path__'</span>
</pre></div>
</div>
<p>Dolayısıyla bütün işaretler, gerçekten de <cite>siparistakip</cite> adlı bir paket
oluşturduğumuzu gösteriyor…</p>
</div>
<div class="section" id="ice-aktarma-islemleri">
<h3>İçe Aktarma İşlemleri<a class="headerlink" href="#ice-aktarma-islemleri" title="Bu başlık için kalıcı bağlantı">¶</a></h3>
<p>Standart paketleri anlatırken, bu paketlerin her konumdan içe aktarılabileceğini
söylemiştik. Aynı şey üçüncü şahıs paketleri için de geçerlidir. Çünkü gerek
Python geliştiricileri, gerekse üçüncü şahıs paketleri geliştirenler, bu
paketleri bize sunarken bunları Python’ın <cite>sys.path</cite> çıktısına eklemişlerdir. O
yüzden standart ve üçüncü şahıs paketlerini içe aktarırken sorun yaşamayız.</p>
<p>Ancak tabii ki kendi yazdığımız paketler <cite>sys.path</cite> listesine ekli olmadığı
için, bunları içe aktarırken bazı noktalara dikkat etmeniz gerekir.</p>
<p>Mesela masaüstünde şu yapıya sahip bir paket oluşturalım:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="o">+</span> <span class="n">paket</span>
<span class="o">|</span><span class="n">__</span> <span class="n">modul1</span><span class="o">.</span><span class="n">py</span>
<span class="o">|</span><span class="n">__</span> <span class="n">modul2</span><span class="o">.</span><span class="n">py</span>
<span class="o">|</span><span class="n">__</span> <span class="n">modul3</span><span class="o">.</span><span class="n">py</span>
<span class="o">+</span> <span class="n">altdizin</span>
<span class="o">|</span><span class="n">__altmodul1</span><span class="o">.</span><span class="n">py</span>
<span class="o">|</span><span class="n">__altmodul2</span><span class="o">.</span><span class="n">py</span>
</pre></div>
</div>
<p>Bu dizinde dosya içerikleri şöyle olsun:</p>
<p><cite>modul1.py</cite>:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="n">isim1</span> <span class="o">=</span> <span class="s1">'modul1'</span>
<span class="nb">print</span><span class="p">(</span><span class="n">isim1</span><span class="p">)</span>
</pre></div>
</div>
<p><cite>modul2.py</cite>:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="n">isim2</span> <span class="o">=</span> <span class="s1">'modul2'</span>
<span class="nb">print</span><span class="p">(</span><span class="n">isim2</span><span class="p">)</span>
</pre></div>
</div>
<p><cite>modul3.py</cite>:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="n">isim3</span> <span class="o">=</span> <span class="s1">'modul3'</span>
<span class="nb">print</span><span class="p">(</span><span class="n">isim3</span><span class="p">)</span>
</pre></div>
</div>
<p><cite>altmodul1.py</cite>:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="n">altisim1</span> <span class="o">=</span> <span class="s1">'altmodul1'</span>
<span class="nb">print</span><span class="p">(</span><span class="n">altisim1</span><span class="p">)</span>
</pre></div>
</div>
<p><cite>altmodul2.py</cite>:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="n">altisim2</span> <span class="o">=</span> <span class="s1">'altmodul2'</span>
<span class="nb">print</span><span class="p">(</span><span class="n">altisim2</span><span class="p">)</span>
</pre></div>
</div>
<p>Şimdi <cite>paket</cite> adlı dizinin bulunduğu klasörde bir etkileşimli kabuk oturumu
açalım. Yalnız bu oturumu <cite>paket</cite> dizinin içinde değil, bir üst dizinde
açacaksınız. Yani o anda bulunduğunuz dizinde <cite>dir</cite> veya <cite>ls</cite> komutu
verdiğinizde <cite>paket</cite> adlı dizini görüyor olmanız lazım… Eğer <cite>dir</cite> veya <cite>ls</cite>
komutunun çıktısında <cite>altdizin</cite> adlı dizini görüyorsanız yanlış yerdesiniz
demektir. Hemen bir üst dizine gidin.</p>
<p>Bulunduğumuz konumda şu komutu verelim:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">paket</span>
</pre></div>
</div>
<p>Eğer hiçbir çıktı almadan bir alt satıra geçtiyseniz her şey yolunda demektir.
Eğer bir hata mesajı görüyorsanız, etkileşimli kabuk oturumunu yanlış konumda
açmışsınızdır. Oturumu doğru konumda açıp tekrar gelin…</p>
<p>Standart paketlerde ve üçüncü şahıs paketlerinde gördüğümüz gibi, bir paketi
yukarıdaki şekilde içe aktardığımızda, o pakete ait herhangi bir modül veya
nitelik otomatik olarak içe aktarılmıyor. <code class="docutils literal notranslate"><span class="pre">dir(paket)</span></code> komutu verdiğinizde
yalnızca standart niteliklerin içe aktarıldığını göreceksiniz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">dir</span><span class="p">(</span><span class="n">paket</span><span class="p">)</span>
<span class="go">['__doc__', '__loader__', '__name__',</span>
<span class="go"> '__package__', '__path__', '__spec__']</span>
</pre></div>
</div>
<p>Gördüğünüz gibi, oluşturduğumuz paket, bir Python paketinin sahip olması gereken
bütün niteliklere sahip.</p>
<p>Şimdi bu paket içindeki <cite>modul1</cite> adlı modülü içe aktaralım:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">paket</span> <span class="kn">import</span> <span class="n">modul1</span>
<span class="go">modul1</span>
</pre></div>
</div>
<p>Böylece <cite>modul1</cite> adlı modülün içindeki değişkenin değerini almış olduk. Paket
içindeki öteki modülleri de aynı şekilde içe aktarabilirsiniz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">paket</span> <span class="kn">import</span> <span class="n">modul2</span>
<span class="go">modul2</span>
<span class="gp">>>> </span><span class="kn">from</span> <span class="nn">paket</span> <span class="kn">import</span> <span class="n">modul3</span>
<span class="go">modul3</span>
</pre></div>
</div>
<p>Peki ya mesela <cite>modul1</cite> içindeki <cite>isim1</cite> değişkenini almak istersek ne
yapacağız?</p>
<p>Dikkatlice bakın:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">paket.modul1</span> <span class="kn">import</span> <span class="n">isim1</span>
<span class="go">modul1</span>
</pre></div>
</div>
<p>Gördüğünüz gibi, <cite>paket</cite> içindeki <cite>modul1</cite> modülünün <cite>isim1</cite> niteliğini
başarıyla aldık. Örnek olması açısından ötekileri de alalım:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">paket.modul2</span> <span class="kn">import</span> <span class="n">isim2</span>
<span class="go">modul2</span>
<span class="gp">>>> </span><span class="kn">from</span> <span class="nn">paket.modul3</span> <span class="kn">import</span> <span class="n">isim3</span>
<span class="go">modul3</span>
</pre></div>
</div>
<p>Buradaki temel mantığı kavradığınızı zannediyorum. Standart modülleri incelerken
bahsettiğimiz içe aktarma yöntemlerini tek tek yukarıdaki yapıya uygulayarak,
buraya kadar anlattıklarımızı anlayıp anlamadığınızı test edebilirsiniz.
Dilerseniz pratik yapmak açısından bir de <cite>altdizin</cite> içindeki modüllere
uzanalım.</p>
<p>Öncelikle <cite>altdizin</cite>’i içe aktaralım:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">paket.altdizin</span>
</pre></div>
</div>
<p>Bu şekilde <cite>paket</cite> adlı paketin <cite>altdizin</cite> adlı alt dizinini içe aktarmış olduk.
Artık bu alt dizin içindeki modüllere ve onların niteliklerine erişebiliriz.
Mesela <cite>paket</cite> adlı paketin <cite>altdizin</cite> adlı alt dizini içindeki <cite>altmodul1</cite> adlı
modülün <cite>altisim1</cite> niteliğini alalım:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">paket</span><span class="o">.</span><span class="n">altdizin</span><span class="o">.</span><span class="n">altmodul1</span><span class="o">.</span><span class="n">altisim1</span>
<span class="go">'altmodul1'</span>
</pre></div>
</div>
<p>Gördüğünüz gibi, <cite>altisim1</cite> niteliğine erişmek için uzun bir yol gitmemiz
gerekiyor. Bu yolu kısaltmak isterseniz modülü şu şekilde içe aktarabilirsiniz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">paket.altdizin</span> <span class="kn">import</span> <span class="n">altmodul1</span>
</pre></div>
</div>
<p>Artık <cite>altmodul1</cite>’in niteliklerine yalnızca <cite>altmodul1</cite> önekiyle
ulaşabilirsiniz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">altmodul1</span><span class="o">.</span><span class="n">altisim1</span>
<span class="go">'altmodul1'</span>
</pre></div>
</div>
<p>Hatta doğrudan <cite>altisim1</cite> niteliğinin kendisini de alabilirsiniz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">paket.altdizin.altmodul1</span> <span class="kn">import</span> <span class="n">altisim1</span>
<span class="gp">>>> </span><span class="n">altisim1</span>
<span class="go">'altmodul1'</span>
</pre></div>
</div>
<p>Gördüğünüz gibi, Python’ın içe aktarma mantığı gayet basit. Bulunduğunuz
konumdan itibaren, alt dizin ve modül adlarını sırasıyla kullanarak ve bunları
birbiriyle nokta işareti ile birleştirerek her bir modüle ve modül içindeki
niteliğe erişebiliyoruz.</p>
</div>
<div class="section" id="ice-aktarma-mantigi">
<h3>İçe Aktarma Mantığı<a class="headerlink" href="#ice-aktarma-mantigi" title="Bu başlık için kalıcı bağlantı">¶</a></h3>
<p>Yukarıdaki örneklerden gördüğünüz gibi, Python’ın içe aktarma mekanizması gayet
basit bir şekilde işliyor. Ancak yine de bu durum sizin rehavete kapılmanıza yol
açmasın. Zira kimi zaman bu mekanizma hiç beklemediğiniz durumların ortaya
çıkmasına da yol açabilir.</p>
<p>Python’da paketler üzerinde çalışırken, Python programlama dilinin paketleri içe
aktarma mekanizmasını çok iyi anlamış olmalısınız. Eğer bu mekanizmayı hakkıyla
anlamadan paket yapmaya kalkışırsanız, Python’ın içe aktarma sırasında
verebileceği sürpriz hatalar size saç baş yoldurabilir. İşte bu bölümde
Python’ın paket içe aktarma mantığı üzerine eğilerek, engebeli yüzeyleri nasıl
aşabileceğimizi anlamaya çalışacağız.</p>
<div class="section" id="ice-aktarma-isleminin-konumu">
<h4>İçe Aktarma İşleminin Konumu<a class="headerlink" href="#ice-aktarma-isleminin-konumu" title="Bu başlık için kalıcı bağlantı">¶</a></h4>
<p>Python’da herhangi bir içe aktarma işlemi yapacağımız zaman, unutmamamız gereken
en önemli konu, Python’ın bütün içe aktarma işlemlerini tek bir konumdan
gerçekleştirdiği gerçeğidir. Bunun ne demek olduğunu anlamak için çok basit bir
örnek verelim.</p>
<p>Yukarıda şöyle bir paket yapısı oluşturmuştuk:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="o">+</span> <span class="n">paket</span>
<span class="o">|</span><span class="n">__</span> <span class="n">modul1</span><span class="o">.</span><span class="n">py</span>
<span class="o">|</span><span class="n">__</span> <span class="n">modul2</span><span class="o">.</span><span class="n">py</span>
<span class="o">|</span><span class="n">__</span> <span class="n">modul3</span><span class="o">.</span><span class="n">py</span>
<span class="o">+</span> <span class="n">altdizin</span>
<span class="o">|</span><span class="n">__altmodul1</span><span class="o">.</span><span class="n">py</span>
<span class="o">|</span><span class="n">__altmodul2</span><span class="o">.</span><span class="n">py</span>
</pre></div>
</div>
<p>Burada <cite>altmodul2.py</cite> dosyasının içine şunu yazalım:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">altmodul1</span>
</pre></div>
</div>
<p>Yani bu dosya ile aynı dizinde bulunan <cite>altmodul1.py</cite> dosyasını, <cite>altmodul2.py</cite>
dosyası içinden bir modül olarak içe aktaralım.</p>
<p>Şimdi, daha önce yaptığımız gibi, <cite>paket</cite> adlı dizinin bulunduğu klasörde bir
etkileşimli kabuk oturumu açalım ve şu komutu yazalım:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">paket.altdizin</span> <span class="kn">import</span> <span class="n">altmodul2</span>
</pre></div>
</div>
<p>Bu komut bize şöyle bir hata mesajı verecek:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="ne">ImportError</span><span class="p">:</span> <span class="n">No</span> <span class="n">module</span> <span class="n">named</span> <span class="s1">'altmodul1'</span>
</pre></div>
</div>
<p>Bu hatanın sebebi, Python’ın <cite>altmodul1</cite> adlı modülü bulamıyor olmasıdır.
Halbuki bu modül, <cite>altmodul2</cite> ile aynı dizinde bulunuyor. O halde acaba Python
bu modülü neden bulamıyor?</p>
<p>Bunu anlamak için şöyle bir deneme yapalım:</p>
<p>Şimdi <cite>altmodul1.py</cite> ve <cite>altmodul2.py</cite> dosyalarının bulunduğu konumda bir
etkileşimli kabuk oturumu başlatın ve şu komutu verin:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">altmodul2</span>
</pre></div>
</div>
<p>Gördüğünüz gibi, bu defa Python herhangi bir hata mesajı vermeden, <code class="docutils literal notranslate"><span class="pre">impport</span>
<span class="pre">altmodul1</span></code> komutuyla <cite>altmodul2.py</cite> dosyası içinden çağırdığımız <cite>altmodul1</cite>
modülünün içeriğini alabildi. Peki ama neden?</p>
<p>Başta da söylediğimiz gibi, Python bütün aktarma işlemlerini tek bir konumdan
yapar. Yani eğer siz bir modülü üst dizinden içe aktardıysanız, o üst dizinin
adı paket içindeki bütün aktarmalara önek olarak eklenecektir. Dolayısıyla
<cite>paket</cite> adlı dizinin bulunduğu konumdan <cite>altdizin</cite> içindeki <cite>altmodul2.py</cite>
dosyasını çağırdığınızda, <cite>altmodul2.py</cite> içindeki <code class="docutils literal notranslate"><span class="pre">import</span> <span class="pre">altmodul1</span></code> komutu,
<cite>altmodul1.py</cite> dosyasını bulamayacaktır. Ama siz <cite>altmodul2.py</cite> dosyasını kendi
dizini içinden çağırdığınızda, <code class="docutils literal notranslate"><span class="pre">import</span> <span class="pre">altmodul1</span></code> komutu, aynı dizin içindeki
<cite>altmodul1.py</cite> dosyasını bulabilecektir.</p>
<p>Bu okuduklarınız ilk bakışta size çok karmaşıkmış gibi gelebilir, ama aslında
biraz dikkat ederseniz bu sistemin hiç de öyle karmaşık olmadığını, aksine son
derece mantıklı olduğunu göreceksiniz.</p>
<p>Durumu daha da netleştirmek için şöyle bir şey yapalım:</p>
<p><cite>altmodul2.py</cite> dosyasını açıp, <code class="docutils literal notranslate"><span class="pre">import</span> <span class="pre">altmodul1</span></code> komutunu şöyle yazalım:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">paket.altdizin</span> <span class="kn">import</span> <span class="n">altmodul1</span>
</pre></div>
</div>
<p>Bu değişikliği kaydettikten sonra tekrar <cite>paket</cite> dizininin bulunduğu konumda bir
oturum açıp şu komutu verelim:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">paket.altdizin</span> <span class="kn">import</span> <span class="n">altmodul2</span>
</pre></div>
</div>
<p>İşte bu kez komutumuz başarıyla çalıştı ve <cite>altmodul1</cite> modülünü bulabildi…</p>
<p>Şimdi de <cite>altmodul1.py</cite> ve <cite>altmodul2.py</cite> dosyalarının bulunduğu konuma tekrar
dönüp burada yine bir etkileşimli kabuk oturumu başlatalım ve daha önce
verdiğimiz şu komutu tekrar verelim:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">altmodul2</span>
</pre></div>
</div>
<p>O da ne! Geçen sefer hatasız çalışan kod bu defa hata verdi:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="ne">ImportError</span><span class="p">:</span> <span class="n">No</span> <span class="n">module</span> <span class="n">named</span> <span class="s1">'paket'</span>
</pre></div>
</div>
<p>Gördüğünüz gibi, modülü içe aktardığımız konumdan ötürü Python bu kez de
<cite>paket</cite> adlı paketi bulamıyor.</p>
<p>Birazdan bütün bu sorunların kesin çözümünü vereceğiz. Ama ondan önce başka bir
konudan söz edelim.</p>
</div>
<div class="section" id="bagil-ice-aktarma">
<h4>Bağıl İçe Aktarma<a class="headerlink" href="#bagil-ice-aktarma" title="Bu başlık için kalıcı bağlantı">¶</a></h4>
<p>Dediğimiz gibi, bir içe aktarma işleminin başarılı olabilmesi, o içe aktarma
işleminin yapıldığı konumun neresi olduğuna ve paket içinde bulunan öteki
modüllerdeki içe aktarmaların nasıl yazıldığına bağlıdır. Yani mesela normalde
aynı konumda bulunan iki modül birbirini yalnızca <code class="docutils literal notranslate"><span class="pre">import</span> <span class="pre">modül_adı</span></code> gibi bir
komutla içe aktarabilecekken, eğer bu modüller üst dizinin bulunduğu konumdan
çağrılıyorsa, içe aktarma başarısız olabilir. Bunun bir örneğini yukarıda
görmüştük. <cite>altdizin</cite> içinde bulunan <cite>altmodul1.py</cite> dosyasını, aynı dizindeki
<cite>altmodul2.py</cite> dosyasından içe aktarmak için <cite>altmodul2.py</cite> dosyasına <code class="docutils literal notranslate"><span class="pre">import</span>
<span class="pre">altmodul1</span></code> yazdığımızda, ana <cite>paket</cite> dizininin bulunduğu konumdan <cite>altdizin</cite>
içindeki <cite>altmodul2.py</cite> dosyasını <code class="docutils literal notranslate"><span class="pre">from</span> <span class="pre">paket.altdizin</span> <span class="pre">import</span> <span class="pre">altmodul2</span></code> gibi
bir komut ile içe aktarma girişimimiz başarısızlığa uğruyordu. Python’ın ilgili
modülü bulabilmesini sağlamak için, <cite>altmodul2.py</cite> dosyasına <code class="docutils literal notranslate"><span class="pre">import</span>
<span class="pre">altmodul1</span></code> yazmak yerine <code class="docutils literal notranslate"><span class="pre">from</span> <span class="pre">paket.altdizin</span> <span class="pre">import</span> <span class="pre">altmodul1</span></code> yazmıştık.
İşte aynı şeyi ‘bağıl içe aktarma’ (<em>relative import</em>) denen bir mekanizma
yardımıyla da gerçekleştirebiliriz.</p>
<p>Bu mekanizmada içe aktarma işlemi, içe aktaran modülün bulunduğu konuma göre
gerçekleşir. Bir örnek verelim…</p>
<p><cite>altmodul2.py</cite> dosyasına <code class="docutils literal notranslate"><span class="pre">import</span> <span class="pre">altmodul1</span></code> veya <code class="docutils literal notranslate"><span class="pre">from</span> <span class="pre">paket.altdizin</span> <span class="pre">import</span>
<span class="pre">altmodul1</span></code> yerine şunu yazalım:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">.</span> <span class="kn">import</span> <span class="n">altmodul1</span>
</pre></div>
</div>
<p>Burada <cite>from</cite> kelimesinden sonra gelen nokta (<cite>.</cite>), içe aktaran modülle aynı
dizine atıfta bulunuyor. Yani bu şekilde <cite>altmodul2.py</cite>’nin bulunduğu dizine
atıfta bulunmuş, böylece bu dizinde bulunan <cite>altmodul1</cite> adlı modülü içe
aktarabilmiş olduk. <cite>paket</cite> dizininden, hatta <cite>altdizin</cite> dizininden yapılacak
içe aktarma işlemleri bu komut sayesinde başarılı olacaktır.</p>
<p>Dediğimiz gibi, orada <cite>.</cite> işareti, içe aktaran modülle aynı dizini temsil
ediyor. Eğer oraya yan yana iki nokta (<cite>..</cite>) koyacak olursanız, bir üst dizine
atıfta bulunabilirsiniz. Mesela bir üst dizinde bulunan <cite>modul3.py</cite> dosyasını
<cite>altmodul2.py</cite> veya <cite>altmodul1.py</cite> dosyasından içe aktarmak isterseniz, bu
dosyaların herhangi birine şu kodu yazabilirsiniz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">..</span> <span class="kn">import</span> <span class="n">modul3</span>
</pre></div>
</div>
<p>Üç nokta yan yana koyduğunuzda ise (<cite>…</cite>) iki üst dizine atıfta bulunmuş
olursunuz. Ancak bu şekilde paketin dışına çıkamayacağınızı da unutmayın. Yani
mesela <cite>paket</cite> dizininin bulunduğu konuma göre bir üst dizinde bulunan, yani
paket dışındaki <cite>falanca.py</cite> adlı bir modülü şu şekilde içe aktaramazsınız:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">...</span> <span class="kn">import</span> <span class="n">falanca</span>
</pre></div>
</div>
<p>Ama tabii eğer paketinizin dizin yapısı iki üst dizine çıkılmasına müsaade
ediyorsa yukarıdaki komut çalışacaktır. Yani elinizdeki, aşağıdakine benzer
yapıda bir pakette:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="o">+</span> <span class="n">paket</span>
<span class="o">|</span><span class="n">__</span> <span class="n">modul1</span><span class="o">.</span><span class="n">py</span>
<span class="o">|</span><span class="n">__</span> <span class="n">modul2</span><span class="o">.</span><span class="n">py</span>
<span class="o">|</span><span class="n">__</span> <span class="n">modul3</span><span class="o">.</span><span class="n">py</span>
<span class="o">+</span> <span class="n">altdizin</span>
<span class="o">|</span><span class="n">__altmodul1</span><span class="o">.</span><span class="n">py</span>
<span class="o">|</span><span class="n">__altmodul2</span><span class="o">.</span><span class="n">py</span>
<span class="o">+</span> <span class="n">altaltdizin</span>
<span class="o">|</span><span class="n">__altaltmodul1</span><span class="o">.</span><span class="n">py</span>
<span class="o">|</span><span class="n">__altaltmodul2</span><span class="o">.</span><span class="n">py</span>
</pre></div>
</div>
<p><cite>altaltmodul1.py</cite> dosyasının bulunduğu konumdan itibaren iki üst dizine çıkarak
<cite>modul2.py</cite> dosyasını içe aktarabilirsiniz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">...</span> <span class="kn">import</span> <span class="n">modul2</span>
</pre></div>
</div>
<p>Yukarıda gösterdiğimiz bağıl içe aktarma mekanizması, paket adı belirtmeden içe
aktarma işlemi gerçekleştirmenizi sağlar. Yani bu mekanizma sayesinde <code class="docutils literal notranslate"><span class="pre">from</span>
<span class="pre">paketadi.modul</span> <span class="pre">import</span> <span class="pre">altmodul</span></code> yerine <code class="docutils literal notranslate"><span class="pre">from</span> <span class="pre">.</span> <span class="pre">import</span> <span class="pre">modul</span></code> gibi bir kod
yazarak, aynı dizin içinde veya üst dizinlerde bulunan modüllere atıfta
bulunabilirsiniz.</p>
</div>
</div>
<div class="section" id="paketlerin-yola-eklenmesi">
<h3>Paketlerin Yola Eklenmesi<a class="headerlink" href="#paketlerin-yola-eklenmesi" title="Bu başlık için kalıcı bağlantı">¶</a></h3>
<p>Daha önce de birkaç kez vurguladığımız gibi, içe aktarma işlemlerinde Python
aradığımız modülü veya paketi bulabilmek için <cite>sys.path</cite> adlı listede görünen
dizinlerin içine bakar. Eğer içe aktarmak istediğiniz paket dizini bu listede
değilse, o paketi içe aktarabilmek için, komut satırını o dizinin bulunduğu
klasörde açmanız gerekir. Yani standart paketler ve üçüncü şahıs paketlerin
aksine, <cite>sys.path</cite>’e eklenmemiş bir paketi her yerden içe aktaramazsınız.</p>
<p>Peki bir paketi <cite>sys.path</cite> listesine nasıl ekleyeceğiz?</p>
<p>Aslında bu sorunun cevabı çok basit. Bildiğiniz gibi, <cite>sys.path</cite> aslında basit
bir listeden ibarettir. Dolayısıyla listeler üzerinde nasıl değişiklik
yapıyorsanız, <cite>sys.path</cite> üzerinde de o şekilde değişiklik yapacaksınız.</p>
<p>Gelin isterseniz, yukarıda oluşturduğumuz <cite>paket</cite> adlı paket üzerinden bir
uygulama yapalım.</p>
<p>Python’da bir paketi <cite>sys.path</cite> listesine eklerken dikkat etmemiz gereken çok
önemli bir konu var: Bir paketi <cite>sys.path</cite> listesine eklerken, paket adına
karşılık gelen dizini değil, paketi içeren dizini bu listeye eklemeliyiz. Yani
mesela <cite>paket</cite> adlı dizin masaüstündeyse, bizim listeye masaüstünün olduğu
dizini eklememiz gerekiyor, paketin olduğu dizini değil…</p>
<p>Dikkatlice bakın:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">os</span><span class="o">,</span> <span class="nn">sys</span>
<span class="gp">>>> </span><span class="n">kullanıcı</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s1">'HOME'</span><span class="p">]</span> <span class="c1">#Windows'ta os.environ['HOMEPATH']</span>
<span class="gp">>>> </span><span class="n">masaüstü</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">kullanıcı</span><span class="p">,</span> <span class="s1">'Desktop'</span><span class="p">)</span>
<span class="gp">>>> </span><span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">masaüstü</span><span class="p">)</span>
</pre></div>
</div>
<p>Böylece masaüstünün bulunduğu dizini <cite>sys.path</cite>’e eklemiş olduk. Burada
uyguladığımız adımlara şöyle bir bakalım.</p>
<p>Öncelikle gerekli modülleri içe aktardık:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">os</span><span class="o">,</span> <span class="nn">sys</span>
</pre></div>
</div>
<p>Amacımız masaüstünün yolunu <cite>sys.path</cite>’e eklemek. Dolayısıyla öncelikle
kullanıcı dizininin nerede olduğunu tespit etmemiz lazım. Bildiğiniz gibi,
kullanıcı dizinleri, bilgisayarı kuran kişinin ismine göre belirlendiği için,
bütün bilgisayarlarda bu değer farklı olur. Bu değerin ne olduğu tespit
edebilmek için <cite>os</cite> modülünün <cite>environ</cite> niteliğinden yararlanabiliriz. Bu
nitelik, işletim sistemine özgü çevre değişkenlerini tutar.</p>
<p>GNU/Linux’ta kullanıcı dizinini tutan çevre değişkeni ‘HOME’ anahtarı ile
gösterilir:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">kullanıcı</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s1">'HOME'</span><span class="p">]</span>
</pre></div>
</div>
<p>Windows’ta ise ‘HOMEPATH’ anahtarını kullanıyoruz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">kullanıcı</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s1">'HOMEPATH'</span><span class="p">]</span>
</pre></div>
</div>
<p>Kullanıcı dizinini elde ettikten sonra, masaüstüne giden yolu bulabilmek için şu
komutu kullanıyoruz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">masaüstü</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">kullanıcı</span><span class="p">,</span> <span class="s1">'Desktop'</span><span class="p">)</span>
</pre></div>
</div>
<p>Sıra geldi elde ettiğimiz tam dizin yolunu <cite>sys.path</cite>’e eklemeye:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">masaüstü</span><span class="p">)</span>
</pre></div>
</div>
<p>Gördüğünüz gibi, listelerin <code class="docutils literal notranslate"><span class="pre">append()</span></code> metodu yardımıyla masaüstünün yolunu
<cite>sys.path</cite> adlı listeye ekledik.</p>
<p>Artık masaüstünde bulunan paketleri rahatlıkla her yerden içe aktarabiliriz.</p>
<div class="admonition note">
<p class="admonition-title">Not</p>
<p><cite>os</cite> modülü hakkında daha geniş bilgi için <a class="reference internal" href="standart_moduller/os.html"><span class="doc">os Modülü</span></a>
başlıklı konuyu inceleyebilirsiniz. <cite>sys</cite> modülü hakkında bilgi için ise
<a class="reference internal" href="standart_moduller/sys.html"><span class="doc">sys Modülü</span></a> başlığını ziyaret edebilirsiniz.</p>
</div>
</div>
<div class="section" id="paketlerde-isim-cakismalari">
<h3>Paketlerde İsim Çakışmaları<a class="headerlink" href="#paketlerde-isim-cakismalari" title="Bu başlık için kalıcı bağlantı">¶</a></h3>
<div class="section" id="init-py-dosyasi">
<h4>__init__.py Dosyası<a class="headerlink" href="#init-py-dosyasi" title="Bu başlık için kalıcı bağlantı">¶</a></h4>
<p class="rubric">Dipnotları:</p>
<dl class="footnote superscript">
<dt class="label" id="id2"><span class="superscript"><a class="fn-backref" href="#id1">1</a></span></dt>
<dd><p>Daha önce Python’ın 2.x sürümlerini kullanmış olanlar, bu yapının
bir paket oluşturmak için yeterli olmadığını düşünebilir. Çünkü Python’ın 2.x
sürümlerinde bir paket oluşturabilmek için, <cite>siparistakip</cite> dizininin içinde
<cite>__init__.py</cite> adlı bir dosya daha oluşturmamız gerekiyordu. Ancak Python3’te
bu zorunluluk ortadan kaldırıldı. Eğer bu söylediğimiz şeyin ne anlama
geldiğini bilmiyorsanız, bu uyarıyı görmezden gelip yolunuza devam
edebilirsiniz.</p>
</dd>
</dl>
</div>
</div>
</div>
</div>
<div class='glyph'><a href='https://yazbel.com'>♣</a></div>
<div class='extrarelbar'>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Gezinti</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="standart_moduller/index.html" title="Önemli Standart Kütüphane Modülleri"
>sonraki</a></li>
<li class="right" >
<a href="nesne_tabanli_programlama7.html" title="Nesne Tabanlı Programlama (Devamı)"
>önceki</a> |</li>
<li class="nav-item nav-item-0"><a href=".">⌂</a></li>
<li class="nav-item nav-item-this"><a href="">Paketler</a></li>
</ul>
</div> </div>
<div class='addcomment'>Yorumlar</div>
<div class='how-to-use'>
<h3>Önemli Not</h3>
Eğer yazdığınız yorum içinde kod kullanacaksanız, kodlarınızı
<span class='tag'><pre><code></span> etiketleri içine alın. Örneğin:
<pre>
<span class='tag'><pre><code class="python"></span>
<span class='keyword'>print</span>(<span class='string'>"Merhaba Dünya!"</span>)
<span class='tag'></code></pre></span>
</pre>
</div>
<div id="disqus_thread"></div>
<script type="text/javascript">
/* * * CONFIGURATION VARIABLES * * */
var disqus_shortname = 'istihza';
/* * * DON'T EDIT BELOW THIS LINE * * */
(function() {
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
})();
</script>
<noscript>Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript" rel="nofollow">comments powered by Disqus.</a></noscript>
<script type="text/javascript" src="//s7.addthis.com/js/300/addthis_widget.js#pubid=ra-4eca48eb2d83faf9" async="async"></script>
<div class="clearer"></div>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Gezinti</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="standart_moduller/index.html" title="Önemli Standart Kütüphane Modülleri"
>sonraki</a></li>
<li class="right" >
<a href="nesne_tabanli_programlama7.html" title="Nesne Tabanlı Programlama (Devamı)"
>önceki</a> |</li>
<li class="nav-item nav-item-0"><a href=".">⌂</a></li>
<li class="nav-item nav-item-this"><a href="">Paketler</a></li>
</ul>
</div>
<div class="footer">
© Copyright 2007-2020, Fırat Özgül | <a href="https://yazbel.com">yazbel.com</a>.
Son güncelleme: 08.08.2020.
<a href="http://sphinx-doc.org/">Sphinx</a> 3.2.0 kullanılarak oluşturuldu.
<br>
<br>
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/"><img
alt="Creative Commons License" style="border-width:0"
src="https://i.creativecommons.org/l/by-nc-sa/3.0/88x31.png" /></a><br />
<br>
</div>
<!-- Start of StatCounter Code for Default Guide -->
<script type="text/javascript">
var sc_project=10396326;
var sc_invisible=1;
var sc_security="fb5cd679";
var scJsHost = (("https:" == document.location.protocol) ?
"https://secure." : "http://www.");
document.write("<sc"+"ript type='text/javascript' src='" +
scJsHost+
"statcounter.com/counter/counter.js'></"+"script>");
</script>
<noscript><div class="statcounter"><a title="hit counter"
href="http://statcounter.com/" target="_blank"><img
class="statcounter"
src="http://c.statcounter.com/10396326/0/fb5cd679/1/"
alt="hit counter"></a></div></noscript>
<!-- End of StatCounter Code for Default Guide -->
</body>
</html>