Os modülü system fonksiyonu


#1

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?


#2

Qaliba bu system C programlama dilinde olan system pythonda kullaniliyor zaten pythonun yapisinda C onde geliyor bazi fonklar direk C-le yazilmis


#3

Hayır os modülü python kullanılarak yazılmış ama yine de c ile yazılmış modüller kullanılmış olabilir.


#4

os python kullanilarak yazilmis evet fakat os-un yapisinda sys modulude kullanilmis os kaynak kodlarina bakarsaniz sys modulu import edilmis


#5

Evet import edilmiş ama benim derdim kaynak kodda system fonksiyonunun bulunmaması.


#6

Bakdim bende goremedim


#7

Bu konuyu tekrar hortlatıyorum. Çünkü system fonksiyonu hâlâ os modülü içinde yok. Bunu nasıl yapmışlar?


#8

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.


#9

Yani dinamik olarak eklenmiş. Python’da bir şeyi görmüyor olmamız, onun var olmadığı anlamına gelmiyor maalesef. :slight_smile:


#10

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 :slight_smile:


#11

Olur mu hic :wink:

https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/posix/system.c;hb=HEAD


#12

Burası artık python’u bağlamaz :smile:


#13

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 :slight_smile:


#14

Python dili, C dili ile yazılmıştır zaten.