Nano Hash - криптовалюты, майнинг, программирование

скрипт python, который принимает аргументы командной строки, должен быть вызван из другого скрипта python

Я полностью понимаю, что должен был написать сценарий правильно с первого раза, но дело в том, что у меня есть сценарий, который генерирует файл данных на основе двух значений, переданных ему из командной строки, например:

 [sinux1~]: ./sim_gen.py 100 .3

Мне нужно вызвать этот скрипт из другого скрипта, перебирая диапазон значений. Я искал вокруг и после навигации по всем «вы не должны» я попробовал:

 exec(open("./sim_gen.py 100 .3").read())

И это, кажется, не работает. Помощь?


  • @JoranBeasley Вы, вероятно, хотите sys.executable, а не python (а если нет, вы, вероятно, вместо этого хотите доверять shbang). Кроме того, аргументы должны быть строками. Кроме того, зачем создавать Popen в communicate вместо того, чтобы просто использовать run (или, для более старого Python, check_output или подобное)? 09.07.2018
  • все действительные точки ... просто потому, что я делал это еще до check_output ... так что это своего рода сила привычки: P, но вы правы 09.07.2018

Ответы:


1

Разобьем это на части:

exec(open("./sim_gen.py 100 .3").read())

Это эквивалентно:

f = open("./sim_gen.py 100 .3")
contents = f.read()
exec(contents)

Этот open — это тот же open, который вы используете, скажем, для чтения текстового файла или CSV. Вы запрашиваете файл с именем "sim_gen.py 100 .3" в текущем каталоге. У тебя есть одна? Конечно нет. Итак, open не работает.


Лучшее решение, как вы уже знаете, переписать sim_gen.py так, чтобы вы могли import вызывать функцию и передавать ей аргументы.


В противном случае, самый чистый ответ, вероятно, будет просто запустить Скрипт Python как подпроцесс:

import subprocess
import sys
subprocess.run([sys.executable, "./sim_gen.py", "100", ".3"])

Обратите внимание, что это фактически то же самое, что вы делаете, когда запускаете сценарий из своей оболочки, поэтому, если там все было в порядке, то почти наверняка все в порядке и здесь.


Если вам действительно нужно exec по какой-то причине, вам нужно будет сделать что-то действительно хакерское и временно изменить argv для кода этого скрипта:

import sys
_argv = sys.argv
try:
    sys.argv = ["./sim_gen.py", "100", ".3"]
    with open("./sim_gen.py 100 .3"):
        exec(f.read())
finally:
    sys.argv = _argv

Хотя на самом деле, если только смысл запуска этого не состоит в том, чтобы незаметно изменить глобальные переменные вашего собственного модуля или тому подобное, вы (а) почти наверняка не нуждаетесь в exec и (б) хотите передать явный аргумент globals, даже если вы действительно это делаете нужно это.

09.07.2018
  • Это не только работает отлично, но вы очень хорошо объяснили. Спасибо. Этот код нужно было запустить только один раз. Я планирую вернуться к рефакторингу, все равно написать правильно. Спасибо. 10.07.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..