Os modülü kaynak kodunda system isimli bir fonksiyon yok(ya da ben bulamadım.) ama biz çok rahat kullanıyoruz. Bu fonksiyon nerden geliyor?
Qaliba bu system C programlama dilinde olan system pythonda kullaniliyor zaten pythonun yapisinda C onde geliyor bazi fonklar direk C-le yazilmis
Hayır os modülü python kullanılarak yazılmış ama yine de c ile yazılmış modüller kullanılmış olabilir.
os python kullanilarak yazilmis evet fakat os-un yapisinda sys modulude kullanilmis os kaynak kodlarina bakarsaniz sys modulu import edilmis
Evet import edilmiş ama benim derdim kaynak kodda system fonksiyonunun bulunmaması.
Bakdim bende goremedim
Bu konuyu tekrar hortlatıyorum. Çünkü system fonksiyonu hâlâ os modülü içinde yok. Bunu nasıl yapmışlar?
Merhaba. Os modülünü dikkatli bir şekilde incelerseniz şöyle bir kısım olduğunu görürsünüz.
if 'posix' in _names:
name = 'posix'
linesep = '\n'
from posix import *
try:
from posix import _exit
except ImportError:
pass
import posixpath as path
import posix
__all__.extend(_get_exports_list(posix))
del posix
elif 'nt' in _names:
name = 'nt'
linesep = '\r\n'
from nt import *
try:
from nt import _exit
except ImportError:
pass
import ntpath as path
import nt
__all__.extend(_get_exports_list(nt))
del nt
Eğer işletim sistemi linux(posix) ise, posix modülünün tüm içeriğini içeri aktarmış. Eğer windows(nt) ise, nt modülünün tüm içeriğini içeri aktarmış.
Linux’u baz alırsak, posix modülünün içerisinde ne olduğunu listeleyelim
>>> import posix
>>> dir(posix)
['EX_CANTCREAT', 'EX_CONFIG', 'EX_DATAERR', 'EX_IOERR', 'EX_NOHOST', 'EX_NOINPUT', 'EX_NOPERM', 'EX_NOUSER', 'EX_OK', 'EX_OSERR', 'EX_OSFILE', 'EX_PROTOCOL', 'EX_SOFTWARE', 'EX_TEMPFAIL', 'EX_UNAVAILABLE', 'EX_USAGE', 'F_OK', 'NGROUPS_MAX', 'O_APPEND', 'O_ASYNC', 'O_CREAT', 'O_DIRECT', 'O_DIRECTORY', 'O_DSYNC', 'O_EXCL', 'O_LARGEFILE', 'O_NDELAY', 'O_NOATIME', 'O_NOCTTY', 'O_NOFOLLOW', 'O_NONBLOCK', 'O_RDONLY', 'O_RDWR', 'O_RSYNC', 'O_SYNC', 'O_TRUNC', 'O_WRONLY', 'R_OK', 'ST_APPEND', 'ST_MANDLOCK', 'ST_NOATIME', 'ST_NODEV', 'ST_NODIRATIME', 'ST_NOEXEC', 'ST_NOSUID', 'ST_RDONLY', 'ST_RELATIME', 'ST_SYNCHRONOUS', 'ST_WRITE', 'TMP_MAX', 'WCONTINUED', 'WCOREDUMP', 'WEXITSTATUS', 'WIFCONTINUED', 'WIFEXITED', 'WIFSIGNALED', 'WIFSTOPPED', 'WNOHANG', 'WSTOPSIG', 'WTERMSIG', 'WUNTRACED', 'W_OK', 'X_OK', '__doc__', '__name__', '__package__', '_exit', 'abort', 'access', 'chdir', 'chmod', 'chown', 'chroot', 'close', 'closerange', 'confstr', 'confstr_names', 'ctermid', 'dup', 'dup2', 'environ', 'error', 'execv', 'execve', 'fchdir', 'fchmod', 'fchown', 'fdatasync', 'fdopen', 'fork', 'forkpty', 'fpathconf', 'fstat', 'fstatvfs', 'fsync', 'ftruncate', 'getcwd', 'getcwdu', 'getegid', 'geteuid', 'getgid', 'getgroups', 'getloadavg', 'getlogin', 'getpgid', 'getpgrp', 'getpid', 'getppid', 'getresgid', 'getresuid', 'getsid', 'getuid', 'initgroups', 'isatty', 'kill', 'killpg', 'lchown', 'link', 'listdir', 'lseek', 'lstat', 'major', 'makedev', 'minor', 'mkdir', 'mkfifo', 'mknod', 'nice', 'open', 'openpty', 'pathconf', 'pathconf_names', 'pipe', 'popen', 'putenv', 'read', 'readlink', 'remove', 'rename', 'rmdir', 'setegid', 'seteuid', 'setgid', 'setgroups', 'setpgid', 'setpgrp', 'setregid', 'setresgid', 'setresuid', 'setreuid', 'setsid', 'setuid', 'stat', 'stat_float_times', 'stat_result', 'statvfs', 'statvfs_result', 'strerror', 'symlink', 'sysconf', 'sysconf_names', 'system', 'tcgetpgrp', 'tcsetpgrp', 'tempnam', 'times', 'tmpfile', 'tmpnam', 'ttyname', 'umask', 'uname', 'unlink', 'unsetenv', 'urandom', 'utime', 'wait', 'wait3', 'wait4', 'waitpid', 'write']
Evet gördüğünüz gibi, posix modülü içerisinde system() fonksiyonu var.
>>> from posix import system
>>> system("echo coderistan")
coderistan
0
Aynı şeyi Windows üzerinde nt modülü ile de deneyebilirsiniz
Sonuç olarak, system() fonksiyonu direkt olarak os modülü içerisinde değil, işletim sistemine göre ilgili modülün içerisinde yazılmıştır.
Yani dinamik olarak eklenmiş. Python’da bir şeyi görmüyor olmamız, onun var olmadığı anlamına gelmiyor maalesef.
Bu konuyu tekrar hortlatıyorum. Biraz daha derine inince, şöyle bir modüle geliyoruz
Bu modül, hem Linux hem de Windows sistemleri için yazılmış. Eğer sistem Windows ise şu kısım çalıştırılıyor
static long
os_system_impl(PyObject *module, const Py_UNICODE *command)
/*[clinic end generated code: output=5b7c3599c068ca42 input=303f5ce97df606b0]*/
{
long result;
Py_BEGIN_ALLOW_THREADS
_Py_BEGIN_SUPPRESS_IPH
result = _wsystem(command);
_Py_END_SUPPRESS_IPH
Py_END_ALLOW_THREADS
return result;
}
Önemli nokta şu
result = _wsystem(command);
Gelen komut _wsystem ile çalıştırılıyor. Bu komut da Windows sistemlerinde komut çalıştırmaya yarıyor, tıpkı system() fonksiyonu gibi. Basit bir şekilde yazılmış yani
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/system-wsystem?view=vs-2017
Burası da diğer sistemler için
Bundan daha derine inemiyoruz artık
Burası artık python’u bağlamaz
Konu patlamanın alemi yok, ama illa sonu py ile biten dosyalar import edilmez. .so uzantılı dosyalar da import edilebilir. Mesela PyQt paketine bakın bakalım,orada py dosyası görecek misin? Windowsda dll uzantılı, linux’da so uzantılıdır bu dosyalar.
Geriye kalanı bu linkten bakın artık.
Aslında @coderistan çok yardımcı oldu bu konuda cevaplarıyla. Kısaca @coderistan ın verdiği c kodları vs. derlenip dll veya dosyasına dönüştürülür, sonra bu dll veya so dosyaları direkt Python dan kullanılır. Ama her so ve dll dosyası import edilemez. Direkt import edilenler dikkat ederseniz dosyanın içerisi Python.h include edilerek ve kodlardaki belli şemalara uyularak hazırlanmıştır.
Eğer Python içinde direkt c dilini kullanmak isterseniz şu konu başlığına göz atılmalıdır.
Unutmayın, python, c dili ile kardeştir.
Hatta bana göre Python, bir c çalışmasıdır.
Kolay gelsin
Python dili, C dili ile yazılmıştır zaten.