Mam następujący plik __main__.py:

def all():
    print "hello world!"

if __name__ == "__main__":
    print "bar"

Jak mogę uruchomić funkcję all z linii poleceń? Poniżej nie działają:

python -c "import __main__; __main__.all()"
python .

Nie wolno mi zmodyfikować pliku ___main__py. (To jest projekt flasth, który próbuję przyczynić się do)

1
Régis B. 20 listopad 2013, 17:28

3 odpowiedzi

Najlepsza odpowiedź

Moduł __main__ jest zawsze częścią pakietu. Dołącz nazwę opakowania podczas importowania:

python -c 'from package.__main__ import all; all()'

Próbny:

$ mkdir testpackage
$ touch testpackage/__init__.py
$ cat << EOF > testpackage/__main__.py
> def all():
>     print "Hello world!"
> if __name__ == '__main__':
>     all()
> EOF
$ python testpackage
Hello world!
$ python -c 'from testpackage.__main__ import all; all()'
Hello world!
3
Martijn Pieters 20 listopad 2013, 13:55

Prawdopodobnie nie chcesz tego robić, ale jeśli __main__.py jest w Twoim katalogu:

python -c "import imp; trick = imp.load_source('__main__', './__main__.py'); trick.all()"

Jeśli twój plik znajduje się w katalogu takim jak foo/__main__.py, możesz to zrobić

python -c "import imp; trick = imp.load_source('foo.__main__', 'foo/__main__.py'); trick.all()"

Zobacz także Co to jest __main__.py? i Jak zaimportować moduł, biorąc pod uwagę pełną ścieżkę?

0
Community 23 maj 2017, 11:51

Jeśli używasz setup.py, aby zainstalować ten pakiet, możesz dodać punkt wejścia wiersza polecenia dla funkcji all:

from setuptools import setup

setup(
    name='mypackage',
    version='1.0',
    packages=['mypackage'],
    entry_points={
        'console_scripts': [
            'mypackage_all = mypackage.__main__:all',
        ],
    },
)

Po uruchomieniu python setup.py develop lub python setup.py install, będziesz mógł wywołać funkcję all za pomocą mypackage_all:

$ mypackage_all
hello world!
0
ostrokach 2 maj 2015, 19:25